Appbarlayout.Behavior
1.作用
处理嵌套滚动偏移处理
2.分析思路
从程序的执行起始点开始分析
3.层级结构
Appbarlayout --> HeaderBehavior --> ViewOffsetBehavior --> Coordinatorlayout.Behavior
4.嵌套处理
onStartNestedScroll 决定是否嵌套滚动 条件:垂直滚动 Appbarlayout拥有可以滚动的子View CoordinatorLayout的高度-其他的直接子View的高度 小于等于 Appbarlayout的高度
5.Appbarlayout拥有可以滚动的子View(getTotalScrollRange() != 0)
也就是说所有的滚动范围不能等于0的时候才满足条件,这里会对Appbarlayout的所有的子View进行一次遍历,SCROLL_FLAG_SCROLL = 0x1&x != 0,如果子View的scrollFlag拥有标示.并且标示是奇数才会满足也就是Scroll的标示,计算子View 的全部高度,包含了边距
其次如果标示等于CROLL_FLAG_EXIT_UNTIL_COLLAPSED rang范围高度好需要通过ViewCompat.getMinimumHeight(child)(这个方法在Api16会返回0,参考反射)减去其最小高度,最后如果rang-getTopInset()小于0就取0,
getTopInset()这里是窗口插入view的时候在api21以上才会出发,如果布局开启了fitWindow那么getTopInset = 布局有效区域(这里受到输入法 状态栏 导航栏等影响)的顶部距离,最终得到的才是有效的滚动范围
getTotalScrollRange() 这里在布局进行初始化的时候已经对其孩子的高度进行了计算,这里会有一个优化 if (mTotalScrollRange != INVALID_SCROLL_RANGE) {return mTotalScrollRange; } 避免了多次计算的问题,逻辑优化,也就是说后期是直接拿到初始化布局的高度的,如果想重新计算一下高度可以试着通过改变mTotalScrollRange = INVALID_SCROLL_RANGE;进行修改
6.directTargetChild代表的什么 例子中是NestScrollView target View代表触发的View
CoordinatorLayout的子View或者是包含嵌套滚动的View
7.CoordinatorLayout的高度-其他的直接子View的高度 小于等于 Appbarlayout的高度
也就是说CoordinatorLayout的高度-其他的View的总高度如果小于等于AppbarLayout的话就会之星滚动动作
1686-0=1686 1686-168(168的正好是Appbarlayout的底部高度)= <= 168
8.getDownNestedPreScrollRange 分析Appbarlayout的最小可滑动范围
在第一次触发了以后就不会在此触发了,也是为了避免重复计算减少绘制时间,FLAG_QUICK_RETURN = SCROLL_FLAG_SCROLL | SCROLL_FLAG_ENTER_ALWAYS;这里需要两个标示才能满足
SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED这个标示表示下拉的范围事Appbarlayout的子View的最小高度的总和 SCROLL_FLAG_EXIT_UNTIL_COLLAPSED 表示下滑范围是子View的高度-最小高度的总和
其他的标示 其子View的高度作为滑动的范围如果开启了fitWindow那么还需要减去这个高度,
9.onNestedPreScroll 嵌套滚动发生之前调用
内部执行条件:dy 向上为正 向下为负 如果滑动距离不等于0并且mSkipNestedPreScroll=false,如果dy小于0 说明是向下的 否则是向上的 getUpNestedPreScrollRange = getTotalScrollRange
10.interpolateOffset 差值器处理以后的偏移值
这里只会在差值器不为空的时候才会有效果,首先对偏移值取绝对值,然后遍历Appbarlayout中的所有的子View,拿到子View的差值器,如果说当前偏移的位置在某个view top等于 和 bottom等于 之间的位置,这里分为四种情况 SCROLL_FLAG_SCROLL SCROLL_FLAG_EXIT_UNTIL_COLLAPSED getFitsSystemWindows 每个View的可滚动范围必须大于0 ,最红会通过计算已滚动距离相对于view的比例得出差值器以后对应的值
11.scroll 执行滚动效果可以说是用来设置用来更新的参数
setHeaderTopBottomOffset 设置头部位置偏移,返回当前已经偏移的距离 getTopBottomOffsetForScrollingSibling = getTopAndBottomOffset 获取当前滚动的距离向上为负,
如果最小偏移不等于0 并且 当前的便宜位置在可滚动区间之间(MathUtils.constrain newOffest如果在区间之内那么就返回当前的offest如果小于那么就返回最小值,如果大于最大值那么就返回最大值)
这里如果设置了差值器newoffest就会发生变化,然后偏移的距离通过setTopAndBottomOffset,如果和上次的偏移相同那么就返回false否则就是true。 mOffsetDelta记录了原值和差值器值的差值,如果偏移并没有改变,dispatchDependentViewsChanged遍历依赖view的集合,调用behavior.onDependentViewChanged用来更新视图,然后通过dispatchOffsetUpdates分发所有的偏移事件,getAppBarChildOnOffset获取当前偏移所处的View,updateAppBarLayoutDrawableState更新drawable的状态。

AppBarLayout.Behavior探究相关推荐

  1. 自定义Behavior的艺术探索-仿UC浏览器主页

    出处:http://www.jianshu.com/p/f7989a2a3ec2 前言&效果预览 最近几个周末基本在研究CoordinatorLayout控件和自定义Behavior当中,这期 ...

  2. CoordinatorLayout 和 AppBarLayout 实现的局部点击按钮实现滑动某一个固定的距离

    实现的效果如下: 如果需要的只是折叠效果 可以看这遍文章点击跳转!!!!!!!!!!!!!!!!!!!! 具体代码如下 findViewById(R.id.tv).setOnClickListener ...

  3. CoordinatorLayout、AppBarLayout、Toolbar使用详解

    又到周末了,小编在这里祝大家周末愉快哦,android开发的童鞋们我们交流学习机会又来啦,今天跟大家交流一下我们常用的标题栏Toolbar的使用,并且配合一些Material Design风格的其他控 ...

  4. CoordinatorLayout中AppBarLayout的折叠仅依靠滑动RecyclerView实现

    直接上效果图,如果不做处理,CoordinatorLayout中的AppBarLayout可以滑动折叠. 我们希望达到如下的效果,即AppBarLayout的折叠仅依靠滑动RecyclerView实现 ...

  5. 【译文】AppBarLayout的越界滚动行为

    原文链接 : Overscroll AppBarLayout Behavior 原文作者 : Nikola Despotoski 译文出自 : 开发技术前线 www.devtf.cn.未经允许,不得转 ...

  6. layui totalRow 多层嵌套json_自定义 Behavior,实现嵌套滑动、平滑切换周月视图的日历...

    使用 CoordinateLayout 可以协调它的子布局,实现滑动效果的联动,它的滑动效果由 Behavior 实现.以前用过小米日历,对它滑动平滑切换日月视图的效果印象深刻.本文尝试用自定义 Be ...

  7. 细说 AppbarLayout,如何理解可折叠 Toolbar 的定制

    Material Design 是个好东西,它的出现使得 Android 也能定制高颜值的界面,并且指导了如果实现复杂炫丽的交互效果,而 Android Surpport Desgin 这个支持包就是 ...

  8. SwipeRefreshLayout+CoordinatorLayout+AppBarLayout+TabLayout+ViewPager+RecyclerView 刷新,不能滑动等问题

    使用SwipeRefreshLayout+CoordinatorLayout+AppBarLayout+TabLayout+ViewPager+Fragment+RecyclerView 实现首页悬浮 ...

  9. 反编译简书app和小红书app滑动效果sticky粘性头布局的实现CoordinatorLayout+behavior

    反编译简书app和小红书app滑动效果sticky粘性头布局的实现CoordinatorLayout+behavior 小红书效果: 简书效果: demo效果图: github地址:https://g ...

  10. android 模拟滑动app,反编译简书app和小红书app滑动效果sticky粘性头布局的实现CoordinatorLayout+behavior...

    反编译简书app和小红书app滑动效果sticky粘性头布局的实现CoordinatorLayout+behavior 小红书效果: xiaohongshuu.gif 简书效果: jianshug.g ...

最新文章

  1. cssbefore图片大小_两小时学会CSS-before after 伪元素
  2. svn服务器发生变更,如何切换
  3. IBS illustrator for the presentation and visualization of biological sequences 中山大学
  4. PHP整站迁移空间,discuz整站数据迁移搬家教程
  5. UA MATH574M 统计学习II 二元分类
  6. 移动相关HTML设置
  7. python中全局变量和局部变量详解_Python全局变量与局部变量详解
  8. 克隆管理员帐号的方法
  9. Beetlex之redis驱动
  10. form表单 1128
  11. [mark] first shellcode
  12. Latex中参考文献排序
  13. 802.11ax速览
  14. java标书_java软件项目投标技术标书模板.doc
  15. 管家婆服装.NET II TOP V6.5-VIP卡使用注意事项(一)
  16. 关于项目文档管理,现在开始就别揪心了!DOClever让你的项目文档纵享丝滑!
  17. python 模拟登陆QQ空间
  18. HierachyViewer的使用
  19. CSDN上传设置资源积分的霸王条款
  20. Vc++ - qt - 仿照微信聊天窗口 - demov.1.0 初步展示

热门文章

  1. [云炬商业计划书阅读分享] 全国挑战杯创业计划大赛预赛评审办法
  2. 为什么我不建议你裸辞做自媒体?
  3. C# Halcon 图像放大缩小代码
  4. 【教男朋友用python做计量】03.利用python进行假设检验(1)
  5. eighth week(2)
  6. XCode11上传ipa到AppStoreConnect
  7. Codeforces 686D. Kay and Snowflake
  8. 《高效能青少年的七个习惯》读后感作文3900字
  9. Enterprise Architect学习(1)
  10. C++创建Windows系统服务