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