Android
KoordinatorLayout och beteenden
Sök…
Introduktion
CoordinatorLayout är en superdriven FrameLayout och målet med denna ViewGroup är att samordna vyerna som finns i den.
CoordinatorLayouts huvudattraktion är dess förmåga att koordinera animeringarna och övergångarna av vyerna i själva XML-filen.
CoordinatorLayout är avsett för två fall med primär användning:
: Som applikationsdekor eller kromlayout på toppnivå
: Som behållare för en specifik interaktion med en eller flera barnvyer
Anmärkningar
CoordinatorLayout är en behållare som utökar FrameLayout .
Genom att ansluta en CoordinatorLayout.Behavior till ett direkt barn av CoordinatorLayout kan du fånga beröringshändelser, fönsterinsatser, mätning, layout och kapslad rullning.
Genom att ange Behaviors för barnvyer av en CoordinatorLayout du ge många olika interaktioner inom en ensamstående förälder och dessa vyer kan också interagera med varandra. Visningsklasser kan ange ett standardbeteende när det används som barn i en CoordinatorLayout hjälp av DefaultBehavior .
Skapa ett enkelt beteende
För att skapa ett Behavior bara klassen CoordinatorLayout.Behavior .
Utöka koordinatorLayout.Beh Fräsen
Exempel:
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);
}
}
Detta beteende är nödvändigt att fästas till ett barn Vy över en CoordinatorLayout att kallas.
Bifoga ett beteende programmatiskt
MyBehavior myBehavior = new MyBehavior();
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
params.setBehavior(myBehavior);
Bifoga ett beteende i XML
Du kan använda attributet layout_behavior att bifoga beteendet i XML:
<View
android:layout_height="...."
android:layout_width="...."
app:layout_behavior=".MyBehavior" />
Bifoga ett beteende automatiskt
Om du arbetar med en anpassad vy kan du bifoga beteendet med @CoordinatorLayout.DefaultBehavior kommentaren:
@CoordinatorLayout.DefaultBehavior(MyBehavior.class)
public class MyView extends ..... {
}
Använda SwipeDismissBehavior
SwipeDismissBehavior fungerar på valfri vy och implementerar SwipeDismissBehavior funktionalitet i våra layouter med en CoordinatorLayout .
Använd bara:
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);
Skapa beroenden mellan vyer
Du kan använda CoordinatorLayout.Behavior att skapa beroenden mellan vyerna. Du kan förankra en View till en annan View av:
- med attributet
layout_anchor. - skapa ett anpassat
Behavioroch implementeralayoutDependsOnmetod som returnerartrue.
Utför följande steg för att skapa ett Behavior för att flytta en ImageView när en annan flyttas (exempelvis verktygsfältet):
Skapa det anpassade beteendet :
public class MyBehavior extends CoordinatorLayout.Behavior<ImageView> {...}Åsido
layoutDependsOnmetoden återvändertrue. Den här metoden kallas varje gång en ändring sker i layouten:@Override public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) { // Returns true to add a dependency. return dependency instanceof Toolbar; }När
layoutDependsOnreturnerastruekallas metodenonDependentViewChanged:@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); }