StickyScrollView git@github.com:emilsjolander/StickyScrollViewItems.git
这个控件是通过继承ScrollView 来重写部分方法实现对 设置了 sticky Tag 的子view 悬停操作的

效果
我们看方法列表

一个开始悬停 方法 和 停止悬停方法应该就是核心了 。

两个方法的调用位置,基本为 doTheStickyThing()

首先看 for 中

可以看到 这是对 两个 view 的查找操作
viewThatShouldStick 与 approachingView
我们循环的集合为 初始化时 获取的 所有标有悬停标记的 view
接下来我们先暂时跳过查找的细节,当我们找到了那个需要被悬停的 view 时
也就是

由于本次流程中 获取了viewThatShouldStick所以 approachingView 应该是为空的
所以获取的 stickyViewTopOffset=0;
接下来执行startStickingView()
根据设置的 tag 来执行相应操作
最后执行了 invalidateRunnable

postDelayed(this,16)每16ms 重绘一次?
通知 scrollview 重新绘制 悬停区域
然后 是绘制过程
dispatchDraw()
中 对原有布局进行默认绘制后 在对当前 currentStickingView 进行再次绘制
绘制区域为悬停区域内
网友评论