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
Behavior
och implementeralayoutDependsOn
metod 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
layoutDependsOn
metoden å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
layoutDependsOn
returnerastrue
kallas 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); }