Android
CoordinateurLayout et comportements
Recherche…
Introduction
Le CoordinatorLayout est un FrameLayout extrêmement puissant et l'objectif de ce groupe de vues est de coordonner les vues qu'il contient.
Le principal atout de CoordinatorLayout est sa capacité à coordonner les animations et les transitions des vues dans le fichier XML lui-même.
CoordinatorLayout est destiné à deux cas d'utilisation principaux:
: Comme un décor d'application de haut niveau ou une disposition chromée
: En tant que conteneur pour une interaction spécifique avec une ou plusieurs vues enfants
Remarques
Le CoordinatorLayout
est un conteneur qui étend le FrameLayout
.
En attachant un CoordinatorLayout.Behavior
à un enfant direct de CoordinatorLayout
, vous pouvez intercepter les événements tactiles, les encarts de fenêtre, les mesures, la mise en page et le défilement imbriqué.
En spécifiant les Behaviors
pour les vues enfant d'un CoordinatorLayout
vous pouvez fournir de nombreuses interactions différentes au sein d'un seul parent et ces vues peuvent également interagir les unes avec les autres. Les classes de vue peuvent spécifier un comportement par défaut lorsqu'elles sont utilisées comme enfant d'un CoordinatorLayout
à l'aide de l'annotation DefaultBehavior
.
Créer un comportement simple
Pour créer un Behavior
simplement la classe CoordinatorLayout.Behavior
.
Prolongez le CoordinatorLayout.Behavior
Exemple:
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);
}
}
Ce comportement doit être associé à un enfant. Vue d'un CoordinatorLayout
à appeler.
Attacher un comportement par programmation
MyBehavior myBehavior = new MyBehavior();
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
params.setBehavior(myBehavior);
Joindre un comportement en XML
Vous pouvez utiliser l'attribut layout_behavior
pour associer le comportement en XML:
<View
android:layout_height="...."
android:layout_width="...."
app:layout_behavior=".MyBehavior" />
Joindre un comportement automatiquement
Si vous travaillez avec une vue personnalisée, vous pouvez attacher le comportement à l'aide de l'annotation @CoordinatorLayout.DefaultBehavior
:
@CoordinatorLayout.DefaultBehavior(MyBehavior.class)
public class MyView extends ..... {
}
Utiliser le SwipeDismissBehavior
SwipeDismissBehavior
fonctionne sur n'importe quelle vue et implémente les fonctionnalités de swipe à supprimer dans nos mises en page avec un CoordinatorLayout
.
Utilisez simplement:
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);
Créer des dépendances entre les vues
Vous pouvez utiliser le CoordinatorLayout.Behavior
pour créer des dépendances entre les vues. Vous pouvez ancrer une View
à une autre View
par:
- en utilisant l'attribut
layout_anchor
. - créer un
Behavior
personnalisé et implémenter la méthodelayoutDependsOn
renvoyanttrue
.
Par exemple, pour créer un Behavior
permettant de déplacer un ImageView
lorsqu'un autre est déplacé (exemple, barre d'outils), procédez comme suit:
Créez le comportement personnalisé :
public class MyBehavior extends CoordinatorLayout.Behavior<ImageView> {...}
Remplacez la méthode
layoutDependsOn
renvoyanttrue
. Cette méthode est appelée chaque fois qu'une modification est apportée à la mise en page:@Override public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) { // Returns true to add a dependency. return dependency instanceof Toolbar; }
Chaque fois que la méthode
layoutDependsOn
renvoietrue
la méthodeonDependentViewChanged
est appelée:@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); }