Implémenter une loupe

Essayer Compose
Jetpack Compose est le kit d'outils d'interface utilisateur recommandé pour Android. Découvrez comment utiliser du texte dans Compose.
<ph type="x-smartling-placeholder"></ph> Modifier.magnifier() →

Disponible sur Android 9 (niveau d'API 28) et versions ultérieures, le widget Loupe est loupe virtuelle qui affiche une copie agrandie d'un View à l'aide d'une un volet en superposition représentant l'objectif. Cette fonctionnalité améliore l'insertion du texte et la sélection de l'expérience utilisateur. Lorsqu'il applique la loupe à du texte, l'utilisateur peut pour positionner précisément le curseur ou les poignées de sélection en affichant les agrandissements du texte dans un volet qui suit leur doigt.

La figure 1 montre comment la loupe facilite la sélection de texte. API Loupe ne sont pas liés au texte, et vous pouvez utiliser ce widget dans divers cas d'utilisation : comme la lecture de petits caractères ou l'agrandissement de noms de lieux difficiles à voir sur les cartes.

Image montrant comment la loupe s&#39;affiche une fois que l&#39;utilisateur a saisi la poignée de sélection de droite
Image 1. Agrandissement du texte. Lorsque l'utilisateur fait glisser la bonne sélection la loupe apparaît pour vous aider à le positionner correctement.

La loupe est déjà intégrée aux widgets de la plate-forme, tels que TextView, EditText et WebView. Il permet de manipuler le texte de manière cohérente dans toutes les applications. Le widget est fourni avec une API simple et peut être utilisé pour agrandir n'importe quelle View. en fonction du contexte de votre application.

Utilisation de l'API

Vous pouvez utiliser la loupe par programmation sur une vue arbitraire, comme suit:

Kotlin

val view: View = findViewById(R.id.view)
val magnifier = Magnifier.Builder(view).build()
magnifier.show(view.width / 2.0f, view.height / 2.0f)

Java

View view = findViewById(R.id.view);
Magnifier magnifier = new Magnifier.Builder(view).build();
magnifier.show(view.getWidth() / 2, view.getHeight() / 2);

En supposant que la hiérarchie des vues comporte la première mise en page, la loupe s'affiche sur la à l'écran et contient une zone centrée sur les coordonnées données dans la vue. Le volet apparaît au-dessus du point central du contenu à copier. La la loupe reste affichée indéfiniment jusqu'à ce que l'utilisateur la ferme.

L'extrait de code suivant montre comment modifier l'arrière-plan de la vue agrandie vue:

Kotlin

view.setBackgroundColor(...)

Java

view.setBackgroundColor(...);

En supposant que la couleur d'arrière-plan est visible dans la loupe, le contenu est obsolète, car l'ancien arrière-plan est toujours s'affiche. Pour actualiser le contenu, utilisez la update(), comme suit:

Kotlin

view.post { magnifier.update() }

Java

view.post(magnifier::update);

Lorsque vous avez terminé, fermez la loupe en appelant la méthode Méthode dismiss():

Kotlin

magnifier.dismiss()

Java

magnifier.dismiss();

Agrandir lors d'une interaction utilisateur

Un cas d'utilisation courant de la loupe consiste à permettre à l'utilisateur d'agrandir une zone d'affichage de en appuyant dessus, comme illustré dans la figure 2.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
Figure 2. La loupe suit le toucher de l'utilisateur. Il est appliqué à un ViewGroup qui contient une "ImageView" à gauche et une TextView à droite.

Pour ce faire, modifiez la loupe en fonction des événements tactiles reçus. par la vue, comme suit:

Kotlin

imageView.setOnTouchListener { v, event ->
  when (event.actionMasked) {
    MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> {
      val viewPosition = IntArray(2)
      v.getLocationOnScreen(viewPosition)
      magnifier.show(event.rawX - viewPosition[0], event.rawY - viewPosition[1])
    }
    MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> {
      magnifier.dismiss()
    }
  }
  true
}

Java

imageView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                // Fall through.
            case MotionEvent.ACTION_MOVE: {
                final int[] viewPosition = new int[2];
                v.getLocationOnScreen(viewPosition);
                magnifier.show(event.getRawX() - viewPosition[0],
                               event.getRawY() - viewPosition[1]);
                break;
            }
            case MotionEvent.ACTION_CANCEL:
                // Fall through.
            case MotionEvent.ACTION_UP: {
                magnifier.dismiss();
            }
        }
        return true;
    }
});

Éléments supplémentaires à prendre en compte lors de l'agrandissement d'un texte

Pour les widgets de texte de la plate-forme, il est important de comprendre la loupe spécifique et d'activer la loupe pour votre affichage de texte personnalisé de manière cohérente. sur la plate-forme Android. Réfléchissez aux points suivants :

  • La loupe se déclenche immédiatement lorsque l'utilisateur saisit une insertion ou une poignée de sélection.
  • La loupe suit toujours le doigt de l'utilisateur horizontalement, tandis que verticalement, elle est fixée au centre de la ligne de texte actuelle.
  • En cas de déplacement horizontal, la loupe se déplace uniquement entre les bords gauche et la limite droite de la ligne actuelle. De plus, lorsque l'utilisateur touche de ces limites ainsi que la distance horizontale entre l'écran tactile dépasse la moitié de la largeur d'origine du contenu de la loupe, la loupe est ignorée, car le curseur n'est plus visible à l'intérieur la loupe.
  • La loupe n'est jamais déclenchée lorsque la police du texte est trop grande. La valeur Texte est est considéré comme trop grand lorsque la différence entre la descente de police et est supérieure à la hauteur du contenu adapté à la loupe. Dans ce cas, le déclenchement de la loupe n'ajoute aucune valeur.