自定义Behavior

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<View>{
    //为了防止报错
    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

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <TextView
        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" />
    <TextView
        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="观察者" />
  
</android.support.design.widget.CoordinatorLayout>

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)这个构造必须写,不然会崩溃


这个只是个简单的应用,当然还有更复杂的效果可以实现


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值