3.自定义一个Behavior
㈠继承Behavior
public class LYJBehavior extends CoordinatorLayout.Behavior { public LYJBehavior(Context context, AttributeSet attrs) { super(context, attrs); } }
㈡2种引用方法:
①在XML布局中直接引用
app:layout_behavior=“你的Behavior包含包名的类名”
②另外一种方法如果你的自定义View默认使用一个Behavior。在你的自定义View类上添加@DefaultBehavior(你的Behavior.class)这句注解。你的View就默认使用这个Behavior,代码如下:
@DefaultBehavior(AppBarLayout.Behavior.class) public class LYJLayout extends LinearLayout {}
㈢生成Behavior后第一件事就是确定依赖关系。重写Behavior的这个方法来确定你依赖哪些View。
@Override public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { return super.layoutDependsOn(parent, child, dependency); }
child 是指应用behavior的View ,dependency 担任触发behavior的角色,并与child进行互动。确定你是否依赖于这个ViewCoordinatorLayout会将自己所有View遍历判断。如果确定依赖。这个方法很重要。
㈣当所依赖的View变动时会回调这个方法。
@Override public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { return super.onDependentViewChanged(parent, child, dependency); }
4.使用自定义的Behavior
自定义一个属性:
<declare-styleable name="Follow"> <attr name="target" format="reference"/> </declare-styleab<strong>le></strong>
使用代码:
public class LYJBehavior extends CoordinatorLayout.Behavior { private int targetId; public LYJBehavior(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Follow); for (int i = 0; i < a.getIndexCount(); i++) { int attr = a.getIndex(i); if(a.getIndex(i) == R.styleable.Follow_target){ targetId = a.getResourceId(attr, -1);//获取联动ID } } a.recycle(); } @Override public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { return dependency.getId() == targetId; } @Override public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { child.setY(dependency.getY()+dependency.getHeight());//child不管dependency怎么移动,其都在dependency下面 return true; } }
XML中的代码如下:
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <View android:id="@+id/first" android:layout_width="match_parent" android:layout_height="128dp" android:background="@android:color/holo_blue_light"/> <View android:id="@+id/second" android:layout_width="match_parent" android:layout_height="128dp" app:layout_behavior="com.example.liyuanjing.tablayoutdemo.LYJBehavior" app:target="@id/first" android:background="@android:color/holo_green_light"/> </android.support.design.widget.CoordinatorLayout>
app:target:中传入ID,自定义behavior就会获取联动的View。然后根据你在onDependentViewChanged设置的联动方式,进行联动。