连续讲了几章关于CoordinationLayout的用法,以及Google给我们提供了两个非常强大的Behavior,以及我们自己实现了一个较为简单的Behavior,今天我带领大家通过实现两个简单的效果来讲解一下Behavior,以及实现我们自定义Behavior的效果。
---------------------------分割线---------------------------
如果不熟悉CoordinationLayout的用法,请看我的另外几篇博客:
基本用法:《Android开发之初识CoordinatorLayout》
进阶案列:《Android开发之实现滑动RecyclerView,浮动按钮的显示和隐藏(二)》
---------------------------分割线---------------------------
自定义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);
}
}
---------------------------
希望两个小案列能够帮助大家更好的理解---------------------------