Android
CoordinatorLayout und Verhalten
Suche…
Einführung
Das CoordinatorLayout ist ein FrameLayout mit Super-Power. Ziel dieser ViewGroup ist es, die darin enthaltenen Ansichten zu koordinieren.
Der Hauptanreiz des CoordinatorLayout ist seine Fähigkeit, die Animationen und Übergänge der Ansichten in der XML-Datei selbst zu koordinieren.
CoordinatorLayout ist für zwei primäre Anwendungsfälle vorgesehen:
: Als Anwendungsdekor auf oberster Ebene oder als Chrom-Layout
: Als Container für eine bestimmte Interaktion mit einer oder mehreren untergeordneten Ansichten
Bemerkungen
Das CoordinatorLayout ist ein Container, der das FrameLayout .
Durch Anhängen eines CoordinatorLayout.Behavior an ein direktes untergeordnetes Element von CoordinatorLayout können Sie Berührungsereignisse, Fensterinsets, Messungen, Layout und verschachteltes Scrollen abfangen.
Durch Angeben von Behaviors für untergeordnete Ansichten eines CoordinatorLayout Sie viele verschiedene Interaktionen innerhalb eines einzelnen übergeordneten CoordinatorLayout bereitstellen. Diese Ansichten können auch miteinander interagieren. View-Klassen können ein Standardverhalten angeben, wenn sie als DefaultBehavior eines CoordinatorLayout mithilfe der Annotation DefaultBehavior .
Ein einfaches Verhalten erstellen
Um ein Behavior zu erstellen, erweitern Sie einfach die CoordinatorLayout.Behavior Klasse.
Erweitern Sie das CoordinatorLayout.Behavior
Beispiel:
public class MyBehavior<V extends View> extends CoordinatorLayout.Behavior<V> {
/**
* Default constructor.
*/
public MyBehavior() {
}
/**
* Default constructor for inflating a MyBehavior from layout.
*
* @param context The {@link Context}.
* @param attrs The {@link AttributeSet}.
*/
public MyBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
Dieses Verhalten muss an eine untergeordnete Ansicht eines CoordinatorLayout angehängt werden, um aufgerufen zu werden.
Binden Sie ein Verhalten programmgesteuert an
MyBehavior myBehavior = new MyBehavior();
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
params.setBehavior(myBehavior);
Fügen Sie ein Verhalten in XML an
Sie können das Attribut layout_behavior , um das Verhalten in XML anzuhängen:
<View
android:layout_height="...."
android:layout_width="...."
app:layout_behavior=".MyBehavior" />
Fügen Sie ein Verhalten automatisch an
Wenn Sie mit einer benutzerdefinierten Ansicht arbeiten, können Sie das Verhalten mithilfe der Annotation @CoordinatorLayout.DefaultBehavior anfügen:
@CoordinatorLayout.DefaultBehavior(MyBehavior.class)
public class MyView extends ..... {
}
Verwenden des SwipeDismissBehavior
Das SwipeDismissBehavior funktioniert für jede Ansicht und implementiert die Funktion zum SwipeDismissBehavior in unseren Layouts mit einem CoordinatorLayout .
Benutz einfach:
final SwipeDismissBehavior<MyView> swipe = new SwipeDismissBehavior();
//Sets the swipe direction for this behavior.
swipe.setSwipeDirection(
SwipeDismissBehavior.SWIPE_DIRECTION_ANY);
//Set the listener to be used when a dismiss event occurs
swipe.setListener(
new SwipeDismissBehavior.OnDismissListener() {
@Override public void onDismiss(View view) {
//......
}
@Override
public void onDragStateChanged(int state) {
//......
}
});
//Attach the SwipeDismissBehavior to a view
LayoutParams coordinatorParams =
(LayoutParams) mView.getLayoutParams();
coordinatorParams.setBehavior(swipe);
Erstellen Sie Abhängigkeiten zwischen Ansichten
Sie können CoordinatorLayout.Behavior , um Abhängigkeiten zwischen Ansichten zu erstellen. Sie können eine View mit einer anderen View verankern, indem Sie:
- mit dem Attribut
layout_anchor. - Erstellen eines benutzerdefinierten
Behaviorund Implementieren der MethodelayoutDependsOn, dietruelayoutDependsOn.
Um beispielsweise ein Behavior zum Verschieben einer ImageView zu erstellen, wenn eine andere verschoben wird (Beispielsymbolleiste), führen Sie die folgenden Schritte aus:
Erstellen Sie das benutzerdefinierte Verhalten :
public class MyBehavior extends CoordinatorLayout.Behavior<ImageView> {...}layoutDependsOnMethodelayoutDependsOndenlayoutDependsOntruelayoutDependsOn. Diese Methode wird bei jeder Änderung des Layouts aufgerufen:@Override public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) { // Returns true to add a dependency. return dependency instanceof Toolbar; }Immer wenn die Methode
layoutDependsOndenonDependentViewChangedlayoutDependsOnzurückgibttruedie MethodeonDependentViewChangedaufgerufen:@Override public boolean onDependentViewChanged(CoordinatorLayout parent, ImageView child, View dependency) { // Implement here animations, translations, or movements; always related to the provided dependency. float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight()); child.setTranslationY(translationY); }