Material Design - CoordinatorLayout、SnackBar源码分析

本文深入探讨了Android CoordinatorLayout的Behavior工作机制,包括自定义Behavior的实现、布局解析过程以及Behavior如何影响子View的滚动行为。分析了SnackBar的显示动画和与FloatingActionButton的交互,强调Behavior生效的条件及CoordinatorLayout的onNestedScroll方法调用链。同时,讨论了ThreadLocal在保证线程安全中的作用。

CoordinatorLayout的behavior如何工作

  • 自定义Behavior放的全类名
    parseBehavior解析布局文件中制定的Behavior

    Behavior到底是怎么实例的,调用 parseBehavior 解析我们设置的 layout_behavior :
    1.获取设置好的全类名 xxx.xx.xx 还可以是 .xx
    2.通过类名获取 class 然后获取两个参数的构造方法
    3.通过反射创建 Behavior 对象 newInatence() , 把所有的 behavior 放入了集合

    CoordinatorLayout 里面有一个 onNestedScroll 方法,里面for循环调用子View的Behavior的onNestedScroll的方法
    CoordinatorLayout 自己并没有调用 onNestedScroll方法

    RecyclerView 里面 startNestedScroll -> ViewParentCompat.onStartNestedScroll() -> IMPL.onStartNestedScroll()
    -> ViewParentCompatLollipopImpl . onStartNestedScroll() -> parent.onStartNestedScroll() -> CoordinatorLayout . onStartNestedScroll()

  • Behavior要能够有效果必须要用 CoordinatorLayout 包裹必须是直接子类
    LinearLayout
    RelativeLayout 解析子布局的属性
    Behavior 是layout_behavior 只能由 CoordinatorLayout的LayoutParams去解析

  • Behavior的效果到底是怎么传递
    ThreadLocal :Handler 源码,保证线程数据安全,保证一个线程只有一个 ThreadLocal 实例

SnackBar 源码分析
2.1 一直显示在底部 android:layout_gravity=“bottom” SnackbarBaseLayout
2.2 动画怎么做的? 两个位移动画
2.3 会把 FloatingActionButton 往上挤,前提是父布局要是 CoordinatorLayout 如果不是就不会挤

findSuitableParent() 找SnackBar的父布局,CoordinatorLayout 其次 FrameLayout
解析系统的布局 ,不居中只有一个文本 + 一个Button 把它加入了 SnackbarBaseLayout
显示是调用的 BaseTransientBottomBar 的 show 隐藏是 hide
如果父布局是CoordinatorLayout 还可以向右滑动删除,ViewCompat.animate() 开启动画进入

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值