Android开发之自定义Behavior

来源:互联网 发布:网络授权书 编辑:程序博客网 时间:2024/06/05 09:24

连续讲了几章关于CoordinationLayout的用法,以及Google给我们提供了两个非常强大的Behavior,以及我们自己实现了一个较为简单的Behavior,今天我带领大家通过实现两个简单的效果来讲解一下Behavior,以及实现我们自定义Behavior的效果。

---------------------------分割线---------------------------

如果不熟悉CoordinationLayout的用法,请看我的另外几篇博客:

基本用法:《Android开发之初识CoordinatorLayout》 

进阶案列:《Android开发之实现滑动RecyclerView,浮动按钮的显示和隐藏(二)》

案例:《Android开发之给TabLayout加上能消失的ToolBar》

案列:《Android开发之CollapsingToolbarLayout的用法》

---------------------------分割线---------------------------

自定义Behavior:继承CoordinatorLayout.Behavior重写里面几个关键的方法。

一:boolean layoutDependsOn(CoordinatorLayout parent, View child,View dependency):

1.用来决定需要监听哪些控件或者容器的状态(1.知道监听谁;2.什么状态改变)。

2.CoordinatorLayout parent :父容器

3.View child:子控件(需要监听dependency这个view的视图们,也可称为观察者)

4.View dependency:你要监听的那个View


二:onDependentViewChanged(CoordinatorLayout parent, View child,View dependency)

1.当被监听的view发生改变的时候回调。

2.可以在此方法里面做一些响应的联动动画等效果。

---------------------------分割线---------------------------

ok我们来看第一个小案例:


下面贴出代码:

import android.animation.ObjectAnimator;import android.content.Context;import android.support.design.widget.CoordinatorLayout;import android.support.v4.view.ViewCompat;import android.util.AttributeSet;import android.view.View;import android.widget.TextView;/** * Created by Fly on 2017/5/13. */public class CustomBehavior extends CoordinatorLayout.Behavior<View> {    public CustomBehavior(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean layoutDependsOn(CoordinatorLayout parent, View child,                                   View dependency) {        //可以根据ID或者TAG来判断        return dependency instanceof TextView || super.layoutDependsOn(parent, child, dependency);    }    @Override    public boolean onDependentViewChanged(CoordinatorLayout parent, View child,                                          View dependency) {        //获取被监听的view的状态---垂直方向位置        int offset = dependency.getTop() - child.getTop();        //让child进行平移        ViewCompat.offsetTopAndBottom(child, offset);        ObjectAnimator oa = ObjectAnimator.ofFloat(child, "rotationX", 0f, 360f);        oa.setDuration(500);        oa.start();        return true;    }}

布局:

 <TextView        android:layout_width="80dp"        android:layout_height="80dp"        android:layout_gravity="right|top"        android:background="#5c3535"        android:text="观察者"        app:layout_behavior="com.fly.lsn19_custombehavior.CustomBehavior" />
---------------------------分割线---------------------------
第二个小案例:


代码奉上:

import android.content.Context;import android.support.design.widget.CoordinatorLayout;import android.support.v4.view.ViewCompat;import android.support.v4.widget.NestedScrollView;import android.util.AttributeSet;import android.view.View;/** * Created by Fly on 2017/5/13. */public class SyncScrollBehavior extends CoordinatorLayout.Behavior<View> {    public SyncScrollBehavior(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {        return (nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL) || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);    }    @Override    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {        int scrollY = target.getScrollY();        child.setScrollY(scrollY);        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);    }    @Override    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY, boolean consumed) {        //快速滑动的惯性移动(松开手指后还会有滑动的效果)        ((NestedScrollView) child).fling((int) velocityY);        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);    }}
---------------------------希望两个小案列能够帮助大家更好的理解---------------------------

原创粉丝点击