Textlupe implementieren

Funktion „Schreiben“ ausprobieren
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Hier erfahren Sie, wie Sie Text in Compose verwenden.

Das in Android 9 (API-Level 28) und höher verfügbare Lupe-Widget ist eine virtuelle Lupe, die eine vergrößerte Kopie eines View über ein Overlay-Fenster anzeigt, das die Linse darstellt. Diese Funktion verbessert das Einfügen und Auswählen von Text. Wenn die Lupe auf Text angewendet wird, kann ein Nutzer den Cursor oder die Auswahlziehpunkte genau positionieren, indem er den vergrößerten Text in einem Bereich ansieht, der seinem Finger folgt.

Abbildung 1 zeigt, wie die Lupe die Textauswahl erleichtert. Die Lupen-APIs sind nicht an Text gebunden. Sie können dieses Widget für eine Vielzahl von Anwendungsfällen verwenden, z. B. kleinen Text lesen oder schwer erkennbare Ortsnamen auf Karten vergrößern.

Ein Bild, das zeigt, wie die Lupe nach dem Angreifen des rechten Auswahlziehpunkts angezeigt wird
Abbildung 1: Text vergrößern. Wenn der Nutzer den rechten Auswahlziehpunkt zieht, wird eine Lupe angezeigt, die eine genauere Platzierung ermöglicht.

Die Lupe ist bereits in Plattform-Widgets wie TextView, EditText und WebView integriert. Er ermöglicht einheitliche Textbearbeitung in allen Apps. Das Widget wird mit einer einfachen API geliefert und kann verwendet werden, um View je nach Anwendungskontext zu vergrößern.

API-Nutzung

Sie können die Lupe folgendermaßen programmatisch für eine beliebige Ansicht verwenden:

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);

Wenn die Ansichtshierarchie das erste Layout hat, wird die Lupe auf dem Bildschirm angezeigt und enthält einen Bereich, der auf die angegebenen Koordinaten in der Ansicht zentriert ist. Das Fenster wird über der Mitte des zu kopierenden Inhalts angezeigt. Die Lupe wird so lange angezeigt, bis der Nutzer sie schließt.

Das folgende Code-Snippet zeigt, wie Sie den Hintergrund der vergrößerten Ansicht ändern:

Kotlin

view.setBackgroundColor(...)

Java

view.setBackgroundColor(...);

Wenn die Hintergrundfarbe in der Lupe sichtbar ist, ist der Inhalt der Lupe veraltet, da ein Bereich der Ansicht mit dem alten Hintergrund angezeigt wird. Verwenden Sie die Methode update(), um den Inhalt zu aktualisieren:

Kotlin

view.post { magnifier.update() }

Java

view.post(magnifier::update);

Schließen Sie anschließend die Lupe, indem Sie die Methode dismiss() aufrufen:

Kotlin

magnifier.dismiss()

Java

magnifier.dismiss();

Bei Nutzerinteraktion vergrößern

Ein häufiger Anwendungsfall für die Lupe besteht darin, dass der Nutzer einen Ansichtsbereich durch Tippen vergrößern kann (siehe Abbildung 2).

Abbildung 2. Die Lupe folgt der Berührung des Nutzers. Sie wird auf eine ViewGroup angewendet, die links eine „ImageView“ und rechts eine TextView enthält.

Aktualisieren Sie dazu die Lupe anhand der von der Ansicht empfangenen Berührungsereignisse wie folgt:

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;
    }
});

Zusätzliche Überlegungen bei der Textvergrößerung

Bei den Plattformtext-Widgets ist es wichtig, das jeweilige Lupenverhalten zu kennen und die Lupe auf der gesamten Android-Plattform einheitlich für die benutzerdefinierte Textansicht zu aktivieren. Hier einige Tipps:

  • Die Lupe wird sofort ausgelöst, wenn der Nutzer einen Einfügungs- oder Auswahlziehpunkt verwendet.
  • Die Lupe folgt immer gleichmäßig dem Finger des Nutzers horizontal, während sie vertikal in der Mitte der aktuellen Textzeile fixiert ist.
  • Bei horizontaler Bewegung bewegt sich die Lupe nur zwischen dem linken und dem rechten Rand der aktuellen Linie. Wenn die Berührung des Nutzers diese Grenzen verlässt und der horizontale Abstand zwischen der Berührung und der nächstgelegenen Grenze größer als die Hälfte der ursprünglichen Breite des Lupeninhalts ist, wird die Lupe geschlossen, da der Cursor nicht mehr in der Lupe sichtbar ist.
  • Die Lupe wird nie ausgelöst, wenn die Schriftart zu groß ist. Der Text gilt als zu groß, wenn der Unterschied zwischen Abstieg und Aufstieg der Schriftart größer ist als die Höhe des Inhalts, der in die Lupe passt. Das Auslösen der Lupe ist in diesem Fall nutzlos.