CoordinatorLayout使用总结

来源:互联网 发布:js 计数器 滚动效果 编辑:程序博客网 时间:2024/06/06 10:53

              coordinatorlayout很强大,但是现在都是千篇一律的是配合appbarlayout等使用,确实很完美,但是也许正是太完美了,结果就是同质化严重,可扩展性差,所以我们应该学习用的同时学习他的思想比较好,比如说coordiantorlayout对于view的解耦做的非常好,所以我重点研究了behaviour,觉得很强大,直接把整理过程记录下来:

           

/** * coordiantorlayout使用总结: * 1.必须作为根部局使用,也就是说在fragment中无法使用,他其实就是一个加强版的framelayout * 2.app:layout_scrollFlags="scroll|enterAlways"属性,是appbarlayout内部的属性,是谁需要滚动消失,谁就指定,但是不能在布局的最外层指定,否则无效 * * 自定义behavior使用规则以及问题: * 1.behaviour规定了追随者的追随规则,因此谁是追随者,谁就设置behaviour * 2.自定义behaviour在AS上一直显示没有任何地方应用,其实已经起作用了 * 3.coordinatorLayout其实只对垂直的两个字view进行动作协调 * 4.coordinatorLayout如果垂直子view大于2个,那么可以设置多个behavior,但是不会起作用,因此再次印证了只能协调垂直的两个子view * 5.设置behaviour的方法有两个,第一个是采用注解的方式设置{@link AppBarLayout},自己内部去定义behavior{@link AppBarLayout.Behavior}, * 第二种方式就是我们自定义,然后通过xml文件进行设置 * 6.接第四条说,如果垂直子view大于2个,例如三个四个,并且类型都一样例如都是imageview,behaviour的泛型也是imageview或者view会怎么样?试验结果是,所有的imageview都是事件源 * 这有什么好处呢?好处就是我们可以设定一定的规则让追随者可以改变追随的人;如果三个view的类型都不同,例如有imageview,textview等,behaviour中的泛型为其中一种,会出现什么 * 效果呢?根据其他博客说,coordinatorLayout会遍历所有的子view然后找到互相依赖的view进行关联,但是测试结果却是,和两个关联者是否挨着有很大关系,可自行测试。 * 7.app:layout_behavior使用的view在自定义behavior中,在xml文件中设置的view为追随者,也就是被动的view,但是在coordinatorLayout和appbarlayout配合使用中,却相反为主动view,不解? * 8.如果仅仅是有两个view,并且运动规则一致,则完全可以使用app:layout_aucher来使用,很简单 * * 参考学习博客: * 1. http://www.jianshu.com/p/26439595ffef * 2. http://www.jianshu.com/p/a506ee4afecb * 3. http://www.jianshu.com/p/72d45d1f7d55 * 4. http://blog.csdn.net/xyz_lmn/article/details/48055919 */public class MyBehaviour extends CoordinatorLayout.Behavior<ImageView> {    public MyBehaviour() {        super();    }    public MyBehaviour(Context context, AttributeSet attrs) {        super(context, attrs);    }    /**     * 这个方法一直都会调用,用来判断事件源是否为依赖的view,猜想:我们可以设置某些限制条件来更换事件源     *     * @param parent     * @param child     * @param dependency     * @return     */    @Override    public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) {        return dependency instanceof TextView;    }    /**     * 三个参数含义说明CoordinatorLayout只能协调垂直的两个子view,这个方法只有当事件源view的尺寸大小或者位置发生改变时调用(其他为测试)     *     * @param parent     CoordinatorLayout     * @param child      设置behaviour的view,即为被动执行者     * @param dependency 他为主动者,是另一个view的依赖者,即为事件源     * @return     */    @Override    public boolean onDependentViewChanged(CoordinatorLayout parent, ImageView child, View dependency) {        return true;    }    /**     * 如果事件源为可滑动的并且实现了NestedScrollingChild接口的view调用才有效果,具体有如下view:     * HorizontalGridView     * NestedScrollView     * RecyclerView     * SwipeRefreshLayout     * VerticalGridView     * 所以这就是为什么listview不可以的原因了,当然我们也可以自定义listview自己加上,具体参数含义可以使用的时候打印一下     *     * @param coordinatorLayout     * @param child     * @param target     * @param dxConsumed     * @param dyConsumed     * @param dxUnconsumed     * @param dyUnconsumed     */    @Override    public void onNestedScroll(CoordinatorLayout coordinatorLayout, ImageView child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);    }}
布局很简单:

   <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/activity_text"    android:layout_width="match_parent"    android:layout_height="match_parent">    <ImageView        android:id="@+id/testImg"        android:layout_width="100dp"        android:layout_height="100dp"        android:layout_gravity="bottom"        android:scaleType="fitXY"        android:src="@drawable/pic3"        app:layout_behavior="com.hawk.android.camera.coordinatorlayoutdemo2.MyBehaviour" />    <TextView        android:id="@+id/child1"        android:layout_width="100dp"        android:layout_height="100dp"        android:layout_gravity="center"        android:background="@color/colorPrimaryDark" /></android.support.design.widget.CoordinatorLayout>
里面有两个不解的地方,欢迎解释,谢谢

0 0