Vorwort
Vor nicht allzu langer Zeit habe ich einen Artikel über Bottom Sheet gelesen und nach Rücksprache mit Kollegen beschlossen, dieses Ding in unsere Anwendung zu implementieren. Nachdem ich genug Stunden damit verbracht hatte, dem Bottom Sheet das Reisen in wenigen Schritten beizubringen (wie bei Google Maps), erkannte ich seine Langeweile und Einschränkungen. Es wurden zwei Lösungen gefunden: Alles in einen Stream einwickeln, der den Zustand des länglichen Vorhangs in Echtzeit überwacht, oder einige Methoden der BottomSheetBehavior-Klasse neu schreiben (zum Glück können Sie dies mit der Apache 2.0-Lizenz tun). Ich habe mich für die zweite Option entschieden, weil sie mir praktikabler erschien, und jetzt werde ich aufgrund meiner Erfahrung versuchen, Ihnen zu sagen, was daraus geworden ist. Ich hoffe, dass dies für jemanden nützlich ist. Nun, fangen wir an.
Anpassung
Ich überspringe die Schritte zum Erstellen eines Projekts und füge das Bottom Sheet von Google hinzu. Wenn Sie dies lesen, haben Sie alle oben genannten Punkte bereits überwunden. Wir müssen zur BottomSheetBehavior-Klasse gehen und ihren Inhalt in die neue CustomBottomSheetBehavior-Klasse kopieren, die wir erstellt haben. Vergessen Sie nach dem Kopieren nicht, alles, was rot markiert ist, umzubenennen. Außerdem sollten wir in der XML-Datei unseres BottomSheet diese Zeile unter Bezugnahme auf unsere neue Klasse umbenennen. Sie sollte ungefähr so aussehen:
app:layout_behavior="com.my.custombottomsheetexample.CustomBottomSheetBehavior"
Wir haben also mehr als 700 Zeilen Java-Code, der beängstigend aussieht. Was machen Sie damit?
Zuerst müssen Sie die onViewReleased () -Methode finden:
public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) { ... }
Wir müssen nur ein paar Zeilen ändern. Wir finden das erste if {...} und ersetzen seinen Inhalt durch diesen Code:
if (yvel < 0.0F) { currentTop = releasedChild.getTop(); if (currentTop > CustomBottomSheetBehavior.this.halfExpandedOffset) { top = CustomBottomSheetBehavior.this.halfExpandedOffset; targetState = 6; } else { top = 0; targetState = 3; } }
Jetzt schreitet unser BottomSheet in zwei Schritten voran und stoppt in der Mitte:
(
)
Höhenänderung
Aber das ist noch nicht alles. Sie können die durchschnittliche Höhe anpassen. Suchen Sie dazu alle in derselben Klasse die Initialisierung der Variablen halfExpandedOffset:
this.halfExpandedOffset = this.parentHeight / 2;
Wenn wir uns diese Linie ansehen, wird klar, dass wir die Höhe nach Belieben anpassen können, auch in Prozent. Persönlich habe ich es vorgezogen, mich so zu ändern:
this.halfExpandedOffset = this.parentHeight * 60 / 100;
(
)
Mein BottomSheet erstreckt sich über 40% der Höhe der Hauptansicht. Das ist alles!