面试官:老哥那么我们继续探讨下这个问题啊。Scrollview和NestScrollView怎么监控呢。
我:???黑人老哥又特么来了。
分析问题
还是和上篇文章一样,我们先看下要解决哪些问题。
ScrollView NestScrollView 的滑动监控怎么做。
View有没有像RecyclerView一样的attach和detch方法,超过1.5s的曝光时间。
View出现一半。
滑动监控
一般人肯定告诉你,这个你自定义个scrollview,然后在onScrollChanged实现个滑动监听的回调什么的。不好意思,我偏不,带你看看另外一个神奇的方法。
先给大家介绍下ViewTreeObserver里面所包含的一些接口。
内部类接口
备注
ViewTreeObserver.OnPreDrawListener
当视图树将要被绘制时,会调用的接口
ViewTreeObserver.OnGlobalLayoutListener
当视图树的布局发生改变或者View在视图树的可见状态发生改变时会调用的接口
ViewTreeObserver.OnGlobalFocusChangeListener
当一个视图树的焦点状态改变时,会调用的接口
ViewTreeObserver.OnScrollChangedListener
当视图树的一些组件发生滚动时会调用的接口
ViewTreeObserver.OnTouchModeChangeListener
当视图树的触摸模式发生改变时,会调用的接口格
各位老哥有没有发现一些奇怪的东西混在里面,哈哈哈。
惯例分析下源码
理论上来说,所有视图状态之类的都是和ViewRootImp相关的。特别是ViewTreeObserver相关的,所以我们的源码分析也是从ViewRootImp开始的。
class ViewRootImp {
// 根视图绘制
private boolean draw(boolean fullRedrawNeeded) {
Surface surface = mSurface;
if (!surface.isValid()) {
return false;