Android
Koordynator Układ i zachowania
Szukaj…
Wprowadzenie
CoordinatorLayout to Super-Power FrameLayout, a celem tej grupy ViewGroup jest koordynacja widoków, które się w niej znajdują.
Głównym atutem CoordinatorLayout jest jego zdolność do koordynowania animacji i przejść widoków w samym pliku XML.
Układ CoordinatorLayout jest przeznaczony do dwóch podstawowych zastosowań:
: Jako dekoracja aplikacji lub układ chrom na najwyższym poziomie
: Jako kontener dla określonej interakcji z jednym lub kilkoma widokami potomnymi
Uwagi
CoordinatorLayout
to kontener, który rozszerza FrameLayout
.
Dołączając CoordinatorLayout.Behavior
do bezpośredniego potomka CoordinatorLayout
, będziesz w stanie przechwytywać zdarzenia dotykowe, wstawki okien, pomiary, układ i przewijanie zagnieżdżone.
Określając Behaviors
dla widoków podrzędnych układu CoordinatorLayout
, możesz zapewnić wiele różnych interakcji w obrębie jednego rodzica, a widoki te mogą również oddziaływać ze sobą. Klasy widoku mogą określać domyślne zachowanie, gdy są używane jako dziecko elementu CoordinatorLayout
przy użyciu adnotacji DefaultBehavior
.
Tworzenie prostego zachowania
Aby utworzyć Behavior
po prostu rozszerz klasę CoordinatorLayout.Behavior
.
Rozszerz CoordinatorLayout.Behavior
Przykład:
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);
}
}
To zachowanie musi zostać dołączone do podrzędnego widoku CoordinatorLayout
aby zostać wywołanym.
Dołącz zachowanie programowo
MyBehavior myBehavior = new MyBehavior();
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
params.setBehavior(myBehavior);
Dołącz zachowanie w XML
Możesz użyć atrybutu layout_behavior
aby dołączyć zachowanie w XML:
<View
android:layout_height="...."
android:layout_width="...."
app:layout_behavior=".MyBehavior" />
Dołącz zachowanie automatycznie
Jeśli pracujesz z widokiem niestandardowym, możesz dołączyć zachowanie za pomocą adnotacji @CoordinatorLayout.DefaultBehavior
:
@CoordinatorLayout.DefaultBehavior(MyBehavior.class)
public class MyView extends ..... {
}
Korzystanie z SwipeDismissBehavior
SwipeDismissBehavior
działa na dowolnym widoku i implementuje funkcję machnięcia, aby zamknąć w naszych układach za pomocą układu CoordinatorLayout
.
Po prostu użyj:
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);
Twórz zależności między widokami
Za pomocą funkcji CoordinatorLayout.Behavior
można tworzyć zależności między widokami. Możesz zakotwiczyć View
do innego View
przez:
- za pomocą atrybutu
layout_anchor
. - tworzenie niestandardowego
Behavior
i implementacja metodylayoutDependsOn
zwracająca wartośćtrue
.
Na przykład, aby utworzyć Behavior
do przenoszenia ImageView
po przeniesieniu innego (przykładowy pasek narzędzi), wykonaj następujące czynności:
Utwórz niestandardowe zachowanie :
public class MyBehavior extends CoordinatorLayout.Behavior<ImageView> {...}
Zastąp metodę
layoutDependsOn
zwracającą wartośćtrue
. Ta metoda jest wywoływana za każdym razem, gdy nastąpi zmiana w układzie:@Override public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) { // Returns true to add a dependency. return dependency instanceof Toolbar; }
Ilekroć metoda
layoutDependsOn
zwraca wartośćtrue
metodaonDependentViewChanged
jest wywoływana:@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); }