Softwaretastatur steuern und animieren

Mit WindowInsetsCompat kann deine App die Bildschirmtastatur (auch als IME) ähnlich dem mit den Systemleisten interagiert. Deine App kann auch WindowInsetsAnimationCompat für nahtlose Übergänge beim Öffnen oder Schließen der Bildschirmtastatur.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder"> <ph type="x-smartling-placeholder">
</ph> Abbildung 1: Zwei Beispiele für die Softwaretastatur offen-geschlossen.

Voraussetzungen

Bevor Sie die Steuerung und Animation für die Bildschirmtastatur einrichten, konfigurieren Sie Ihre App so, dass sie randumfassen wird. Dadurch können verarbeitet Systemfenster-Einfügungen wie Systemleisten und der Bildschirmtastatur.

Sichtbarkeit der Tastatursoftware prüfen

Software mit WindowInsets prüfen Sichtbarkeit über die Tastatur.

Kotlin

val insets = ViewCompat.getRootWindowInsets(view) ?: return
val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime())
val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom

Java

WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(view);
boolean imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime());
int imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom;

Alternativ können Sie ViewCompat.setOnApplyWindowInsetsListener um Änderungen bei der Sichtbarkeit der Bildschirmtastatur zu beobachten.

Kotlin

ViewCompat.setOnApplyWindowInsetsListener(view) { _, insets ->
  val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime())
  val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom
  insets
}

Java

ViewCompat.setOnApplyWindowInsetsListener(view, (v, insets) -> {
  boolean imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime());
  int imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom;
  return insets;
});

Animation mit der Bildschirmtastatur synchronisieren

Wenn ein Nutzer auf ein Texteingabefeld tippt, schiebt sich die Tastatur von unten auf dem Bildschirm, wie im folgenden Beispiel gezeigt:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder"> <ph type="x-smartling-placeholder">
</ph> Abbildung 2: Synchronisierte Tastaturanimation.
  • Das Beispiel mit dem Label „Nicht synchronisiert“ Abbildung 2 zeigt das Standardverhalten in Android 10 (API-Level 29), wobei das Textfeld und der Inhalt der App statt mit der Tastatur zu synchronisieren. Animation – ein Verhalten, das optisch überwältigend sein kann.

  • Ab Android 11 (API-Level 30) kannst du WindowInsetsAnimationCompat, um die Umstellung der App zu synchronisieren mit schiebt die Tastatur vom unteren Bildschirmrand nach oben und unten. Das sieht so aus: flüssiger, wie im Beispiel mit der Bezeichnung „Synchronisiert“ wie in Abbildung 2 dargestellt.

Konfigurieren WindowInsetsAnimationCompat.Callback mit der Ansicht, die mit der Tastaturanimation synchronisiert wird.

Kotlin

ViewCompat.setWindowInsetsAnimationCallback(
  view,
  object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP) {
    // Override methods.
  }
)

Java

ViewCompat.setWindowInsetsAnimationCallback(
    view,
    new WindowInsetsAnimationCompat.Callback(
        WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STOP
    ) {
      // Override methods.
    });

In WindowInsetsAnimationCompat.Callback gibt es mehrere Methoden zum Überschreiben: nämlich onPrepare(), onStart(), onProgress() und onEnd(). Rufe zuerst onPrepare() auf, bevor du das Layout änderst.

onPrepare wird aufgerufen, wenn eine Insets-Animation und vor den Ansichten gestartet werden. werden aufgrund einer Animation wieder eingeblendet. Sie können damit den Startstatus speichern, In diesem Fall ist dies die untere Koordinate der Ansicht.

<ph type="x-smartling-placeholder">
</ph> Ein Bild, auf dem die untere Koordinate des Startzustands der Stammansicht zu sehen ist. <ph type="x-smartling-placeholder">
</ph> Abbildung 3: Mit onPrepare() für und notieren Sie den Startstatus.

Das folgende Snippet zeigt einen Beispielaufruf für onPrepare:

Kotlin

var startBottom = 0f

override fun onPrepare(
  animation: WindowInsetsAnimationCompat
) {
  startBottom = view.bottom.toFloat()
}

Java

float startBottom;

@Override
public void onPrepare(
    @NonNull WindowInsetsAnimationCompat animation
) {
  startBottom = view.getBottom();
}

onStart wird aufgerufen, wenn eine Einfügungsanimation gestartet wird. Damit können Sie alle der Ansichtseigenschaften in den Endzustand der Layoutänderungen. Wenn Sie eine Der OnApplyWindowInsetsListener-Callback wurde auf eine der Ansichten festgelegt, er ist bereits die an dieser Stelle aufgerufen werden. An dieser Stelle empfiehlt es sich, den Endzustand der Ansicht zu speichern. Eigenschaften.

<ph type="x-smartling-placeholder">
</ph> Ein Bild, das die untere Koordinate des Endzustands der Ansicht zeigt <ph type="x-smartling-placeholder">
</ph> Abbildung 4: onStart() zum Aufnehmen verwenden Endzustand.

Das folgende Snippet zeigt einen Beispielaufruf für onStart:

Kotlin

var endBottom = 0f

override fun onStart(
  animation: WindowInsetsAnimationCompat,
  bounds: WindowInsetsAnimationCompat.BoundsCompat
): WindowInsetsAnimationCompat.BoundsCompat {
  // Record the position of the view after the IME transition.
  endBottom = view.bottom.toFloat()

  return bounds
}

Java

float endBottom;

@NonNull
@Override
public WindowInsetsAnimationCompat.BoundsCompat onStart(
    @NonNull WindowInsetsAnimationCompat animation,
    @NonNull WindowInsetsAnimationCompat.BoundsCompat bounds
) {
  endBottom = view.getBottom();
  return bounds;
}

onProgress wird aufgerufen, wenn sich die Einfügungen im Rahmen der laufenden Animation ändern. Sie können ihn überschreiben und sich bei jedem Frame über die Tastatur benachrichtigen lassen. Animation. Ansichtseigenschaften aktualisieren, sodass die Ansicht in Synchronisierung mit der Tastatur.

Alle Layoutänderungen sind jetzt abgeschlossen. Wenn Sie beispielsweise Mit View.translationY, um die Ansicht zu verschieben, nimmt der Wert schrittweise für alle und erreicht schließlich 0 bis zur ursprünglichen Layoutposition.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder"> <ph type="x-smartling-placeholder">
</ph> Abbildung 5: Mit onProgress() für um die Animationen zu synchronisieren.

Das folgende Snippet zeigt einen Beispielaufruf für onProgress:

Kotlin

override fun onProgress(
  insets: WindowInsetsCompat,
  runningAnimations: MutableList<WindowInsetsAnimationCompat>
): WindowInsetsCompat {
  // Find an IME animation.
  val imeAnimation = runningAnimations.find {
    it.typeMask and WindowInsetsCompat.Type.ime() != 0
  } ?: return insets

  // Offset the view based on the interpolated fraction of the IME animation.
  view.translationY =
    (startBottom - endBottom) * (1 - imeAnimation.interpolatedFraction)

  return insets
}

Java

@NonNull
@Override
public WindowInsetsCompat onProgress(
    @NonNull WindowInsetsCompat insets,
    @NonNull List<WindowInsetsAnimationCompat> runningAnimations
) {
  // Find an IME animation.
  WindowInsetsAnimationCompat imeAnimation = null;
  for (WindowInsetsAnimationCompat animation : runningAnimations) {
    if ((animation.getTypeMask() & WindowInsetsCompat.Type.ime()) != 0) {
      imeAnimation = animation;
      break;
    }
  }
  if (imeAnimation != null) {
    // Offset the view based on the interpolated fraction of the IME animation.
    view.setTranslationY((startBottom - endBottom)

        *   (1 - imeAnimation.getInterpolatedFraction()));
  }
  return insets;
}

Optional können Sie onEnd überschreiben. Diese Methode wird nach der Animation aufgerufen. ist vorbei. Dies ist ein guter Zeitpunkt, um alle temporären Änderungen zu entfernen.

Weitere Informationen