Material Design开发之旅 源码篇

95 篇文章 0 订阅

上面介绍了MD一些常用控件使用,那他的任何实现这些酷炫的动画呢?那就需要我们从源码层看看他的工作流程,今天看源码的主线是看看NestedScrollView和CoordinatorLayout的 ,对触摸事件处理的工作流程。

//首先我们点击NestedScrollView源码,他继承FrameLayout实现NestedScrollingParent2, NestedScrollingChild2, ScrollingView;

当我们滑动NestedScrollView时根据触摸事件分发首先调用拦截方法onInterceptTounchEvent方法,如果对按时事件分发不了解可以看我这篇文章https://blog.csdn.net/qq_36237165/article/details/103046990

当我们手中按下时action是0,源码调用了startNestedScroll方法,点击这个方法进去看看

我们点击这个方法看看最后调用NestedScrollingChildHelper的startNestedScroll方法,点击这个方法进去看看

//我们看到上面这个方法,获取父类,同时把滑动事件封装ViewParentCompat类的onNestedScrollAccepted方法里面,我们点击

这个方法里面看看

 

 

这个方法调用了父类的onNestedScrollAccepted方法并且把滑动事件也传递过去了。那他的父类是谁呢?那肯定是coordinatorLayout,那我们打开coordinatorLayout源码找到onNestedScrollAccepted方法看看。

 

里就调用了自己的onNestedScrollAccepted方法,

 

 

//我们可以看到这个方法 就是遍历所有子view ,通过子view属性获取behavior的全类名创建behavior,看源码多的小伙伴估计猜到他是通过什么方法创建behavior了,对就是反射。  把滑动事件传递给了Behavior的onNestedScrollAccepted方法。

为了验证我们的猜测可以跟踪源码到如下

 

//通过反射创建双参构造方法的实例。这也验证了behavior为什么必须实现双参构造方法。

,通过NestedScrollview的按下事件流程我们就可以知道他们的其他事件其实也是按这个流程他事件传递给behavior的。

//总结:当nestedScrollview开始滑动时,他会告诉coordinatorLayout你是否需要知道我们的滑动事件,当需要是,他就会把所有滑动事件告诉coordinatorLayout,coordinatorLayout就会变量子view解析子view属性,是否设置layout_behavior属性,如果设置了就通过反射创建behavior实例,调用layoutDependsOn判断那个子view是被观察者,(设置behavior的是观察者),当被观察者的位置大小发生改变及会调用onDendentViewChanged方法,这个方法实现观察者的动画效果代码。

//这时可能有些小伙伴会好奇,nestedScrollview是如何跟CoordinatorLayout实现通信的,我们点击源码进去发现,他们都实现了nestedScrollingParent2接口,我们点击接口发现接口里面什么也没做,NestedScrollingParentHelper事接口的代理类,这才是真正做事的类。细心的你还会发现有个nestedscrollingChild2类,其实这个两个类是对触摸事件一个向上传递(父类传递),一个向下传递(子类传递),

 

//下面我们根据源码原理,我自定义一个coordinatorLayout和behavior。

感兴趣的可以下载源码看看,整个流程就更加清晰

https://github.com/zhudaihao/MaterialDesign

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值