1、这是效果
二、使用注意
1、某个view需要监听另一个View的状态(位置、大小、显示状态等)
(需要重写layoutDependsOn( 用来决定需要监听那些控件或者容器的状态),onDependentViewChanged(当被监听的view发生改变的时候回调))
2、某个view需要监听CoordinatorLayout里边所有空间的滑动状态。
( 需要重写的方法:onStartNestedScroll(滑动开始的时候回调),onNestedPreScroll(滑动的时候回调),onNestedFling(快速滑动的时候回调),onNestedScroll (滑动的时候回到,可进行滑动事件处理))
注意:能被CoordinatorLayout捕获滑动状态的控件只有,RecyclerView、NestedScrollView、ViewPager
因为我们这里是根据当前点击的textView去移动另一个所以是第一种情况,所以重写上边那两个方法
三、代码
CustomBehavior.java
public class CustomBehavior extends CoordinatorLayout.Behavior{
//为了防止报错
public CustomBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 用来决定需要监听那些控件或者容器的状态
* @param parent 父容器
* @param child 子控件---需要监听的dependency这个view的视图们(观察者)
* @param dependency 你要监听的那个View
* @return
*/
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
//
return dependency instanceof TextView||super.layoutDependsOn(parent, child, dependency);
}
/**
* 当被监听的view发生改变的时候回调
* 可以在此方法里面做一些响应的联动动画等效果
* @param parent
* @param child
* @param dependency
* @return
*/
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
//获取被监听的view的状态----垂直方向位置
int offset=dependency.getTop()-child.getTop();
ViewCompat.offsetTopAndBottom(child,offset);
return true;
}
}
main.xml
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
android:id="@+id/tv1"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginLeft="50dp"
android:layout_marginTop="40dp"
android:background="#ff0"
android:text="被观察--dependent" />
app:layout_behavior="com.xiaofan.test.view.CustomBehavior"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginLeft="180dp"
android:layout_marginTop="40dp"
android:background="#f00"
android:text="观察者" />
MainActivity.java
public class MainActivity extends AppCompatActivity {
private TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv1 = (TextView)findViewById(R.id.tv1);
tv1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ViewCompat.offsetTopAndBottom(v,12);
}
});
}
注意:
app:layout_behavior自定义view最好用全路径
CustomBehavior(Context context, AttributeSet attrs)这个构造必须写,不然会崩溃
这个只是个简单的应用,当然还有更复杂的效果可以实现