Android
CoordinatorLayout and Behaviors
Ricerca…
introduzione
Il CoordinatorLayout è un FrameLayout superpotente e l'obiettivo di questo ViewGroup è di coordinare le viste al suo interno.
L'attrattiva principale di CoordinatorLayout è la sua capacità di coordinare le animazioni e le transizioni delle viste all'interno del file XML stesso.
CoordinatorLayout è destinato a due casi di utilizzo principale:
: Come decorazione per applicazioni di alto livello o layout cromati
: Come contenitore per una specifica interazione con una o più viste secondarie
Osservazioni
Il CoordinatorLayout è un contenitore che estende il FrameLayout .
Associando un CoordinatorLayout.Behavior a un figlio diretto di CoordinatorLayout , sarete in grado di intercettare gli eventi tattili, le finestre, le misure, il layout e lo scorrimento annidato.
Specificando Behaviors per le visualizzazioni secondarie di un CoordinatorLayout è possibile fornire molte interazioni diverse all'interno di un singolo genitore e tali visualizzazioni possono anche interagire tra loro. Le classi di vista possono specificare un comportamento predefinito quando vengono utilizzate come figlio di un CoordinatorLayout utilizzando l'annotazione DefaultBehavior .
Creare un semplice comportamento
Per creare un Behavior basta estendere la classe CoordinatorLayout.Behavior .
Estendi il CoordinatorLayout.Behavior
Esempio:
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);
}
}
Questo comportamento deve essere collegato a un figlio Visualizzazione di un CoordinatorLayout da chiamare.
Allegare un comportamento a livello di codice
MyBehavior myBehavior = new MyBehavior();
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
params.setBehavior(myBehavior);
Allegare un comportamento in XML
Puoi utilizzare l'attributo layout_behavior per collegare il comportamento in XML:
<View
android:layout_height="...."
android:layout_width="...."
app:layout_behavior=".MyBehavior" />
Allegare un comportamento automaticamente
Se si sta lavorando con una vista personalizzata, è possibile allegare il comportamento utilizzando l'annotazione @CoordinatorLayout.DefaultBehavior :
@CoordinatorLayout.DefaultBehavior(MyBehavior.class)
public class MyView extends ..... {
}
Utilizzando il SwipeDismissBehavior
SwipeDismissBehavior funziona su qualsiasi vista e implementa la funzionalità di scorrimento per ignorare nei nostri layout con un CoordinatorLayout .
Basta usare:
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);
Crea dipendenze tra le viste
Puoi utilizzare CoordinatorLayout.Behavior per creare dipendenze tra le viste. Puoi ancorare una View a un'altra View di:
- usando l'attributo
layout_anchor. - creando un
Behaviorpersonalizzato e implementando il metodolayoutDependsOnche restituiscetrue.
Ad esempio, per creare un Behavior per lo spostamento di un ImageView quando ne viene spostato un altro (barra degli strumenti di esempio), effettuare le seguenti operazioni:
Crea il comportamento personalizzato :
public class MyBehavior extends CoordinatorLayout.Behavior<ImageView> {...}Sovrascrivi il metodo
layoutDependsOnche restituiscetrue. Questo metodo viene chiamato ogni volta che si verifica una modifica al layout:@Override public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) { // Returns true to add a dependency. return dependency instanceof Toolbar; }Ogni volta che il metodo
layoutDependsOnrestituiscetrue, viene chiamato il metodoonDependentViewChanged:@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); }