CoordinatorLayout使用总结

              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>

里面有两个不解的地方,欢迎解释,谢谢


补充:最近又翻开看了看这个控件,觉得确实很强大,不过仔细想想又存在问题,那就是屏幕适配问题,如何解决屏幕适配呢?后来虽然解决了,不过还是暂时放弃学习这个控件了,记录一下这次的学习资料:

ConstraintLayout学习网站记录:
1.http://blog.csdn.net/sinat_34383316/article/details/70674399?locationNum=9&fps=1
2.http://m.blog.csdn.net/qq_33689414/article/details/75103731
3.http://blog.csdn.net/u013706904/article/details/52957946
4.http://blog.chengyunfeng.com/?p=1030
5.https://mp.weixin.qq.com/s/kFPDThFZo7ZGOBLUv22myQ
6.http://www.jianshu.com/p/792d2682c538
7.http://blog.csdn.net/lmj623565791/article/details/78011599
8.http://blog.csdn.net/guolin_blog/article/details/53122387
9.https://mp.weixin.qq.com/s/gGR2itbY7hh9fo61SxaMQQ


ConstraintLayout其实就是加强版的相对布局,设计的初衷就是为了解决布局的深层嵌套导致的页面渲染性能下降问题,但是我们现在已经做好了屏幕的适配,完全可以使用绝对
布局的方式来减少布局的嵌套,所以暂时忽略掉这个控件的学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值