Android
КоординаторLayout и поведение
Поиск…
Вступление
КоординаторLayout является супермощным FrameLayout, и цель этой ViewGroup - координировать представления, которые внутри него.
Основной привлекательностью CoordinatorLayout является его способность координировать анимацию и переходы представлений в самом файле XML.
КоординаторLayout предназначен для двух основных случаев использования:
: Как декор приложения верхнего уровня или хром
: Как контейнер для конкретного взаимодействия с одним или несколькими дочерними представлениями
замечания
CoordinatorLayout
- это контейнер, который расширяет FrameLayout
.
Присоединив CoordinatorLayout.Behavior
к прямому ребенку CoordinatorLayout
, вы сможете перехватывать события касания, вставки окна, измерение, макет и вложенную прокрутку.
Указав Behaviors
для дочерних представлений CoordinatorLayout
вы можете обеспечить множество разных взаимодействий внутри одного родителя, и эти представления также могут взаимодействовать друг с другом. В классах просмотра могут указываться поведение по умолчанию при использовании в качестве дочернего элемента CoordinatorLayout
с использованием аннотации DefaultBehavior
.
Создание простого поведения
Чтобы создать Behavior
просто расширьте класс CoordinatorLayout.Behavior
.
Расширьте координаторLayout.Behavior
Пример:
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);
}
}
Это поведение должно быть привязано к ребенку. Вид CoordinatorLayout
для вызова.
Привязать поведение программно
MyBehavior myBehavior = new MyBehavior();
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
params.setBehavior(myBehavior);
Привязать поведение в XML
Вы можете использовать атрибут layout_behavior
для привязки поведения в XML:
<View
android:layout_height="...."
android:layout_width="...."
app:layout_behavior=".MyBehavior" />
Прикрепите поведение автоматически
Если вы работаете с настраиваемым представлением, вы можете прикрепить поведение, используя аннотацию @CoordinatorLayout.DefaultBehavior
:
@CoordinatorLayout.DefaultBehavior(MyBehavior.class)
public class MyView extends ..... {
}
Использование SwipeDismissBehavior
SwipeDismissBehavior
работает над любым представлением и реализует функциональные возможности салфетки для удаления в наших макетах с помощью CoordinatorLayout
.
Просто используйте:
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);
Создание зависимостей между представлениями
Вы можете использовать CoordinatorLayout.Behavior
для создания зависимостей между представлениями. Вы можете якорь View
на другой View
по:
- используя атрибут
layout_anchor
. - создание пользовательского
Behavior
и реализация методаlayoutDependsOn
возвращающегоtrue
.
Например, чтобы создать Behavior
для перемещения ImageView
при перемещении другого (пример панели инструментов), выполните следующие действия:
Создайте пользовательское поведение :
public class MyBehavior extends CoordinatorLayout.Behavior<ImageView> {...}
Переопределите метод
layoutDependsOn
возвращающийtrue
. Этот метод вызывается каждый раз, когда происходит изменение в макете:@Override public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) { // Returns true to add a dependency. return dependency instanceof Toolbar; }
Всякий раз, когда метод
layoutDependsOn
возвращаетtrue
onDependentViewChanged
методonDependentViewChanged
:@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); }