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
Behavior
personalizzato e implementando il metodolayoutDependsOn
che 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
layoutDependsOn
che 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
layoutDependsOn
restituiscetrue
, 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); }