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
Behavior
und Implementieren der MethodelayoutDependsOn
, dietrue
layoutDependsOn
.
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> {...}
layoutDependsOn
MethodelayoutDependsOn
denlayoutDependsOn
true
layoutDependsOn
. 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
layoutDependsOn
denonDependentViewChanged
layoutDependsOn
zurückgibttrue
die MethodeonDependentViewChanged
aufgerufen:@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); }