Android 权限-HaloPermission 详细介绍
如何自定义Behaviour?
VLayout实现原理,即如何自定义LayoutManager
自定义LayoutManager,RecyclerView中如何自定义LayoutManager
RecyclerView与ListView(缓存原理,区别联系,优缺点)
requestLayout,invalidate,postInvalidate区别与联系
ViewPager的缓存实现
嵌套滑动实现原理
View的绘制原理,自定义View,自定义ViewGroup
TouchSlop 表示系统所能识别的最小移动距离,用于判断用户滑动距离是否有效
touchSlop= ViewConfiguration.get(mContext).getScaledTouchSlop();
VelocityTracker用于测算用户水平或者竖直方向的滑动速度
小结:
某个控件一旦处理了MotionEvent中的Action_down事件之后,那么后续的事件(Action_move/Action_up)正常来说,都是交由该控件处理,如果该控件是ViewGroup的话,onInterceptTouchEvent()只会调用一次,不会重复调用(一旦处理事件之后,后续不会再调用)因此对于ViewGroup,不建议在onInterceptTouchEvent()方法中处理过多逻辑(特别是处理Action_move/Action_up事件),因为不是每次都调用;
事件传递过程是由外到内的。简单理解就是:事件总是先传递给父元素,然后再由父元素分发给子View,通过requestDisallowInterptTouchEvent方法可以再子元素中干预元素的事件分发过程,但是ACTION_DOWN除外;
常见滑动冲突
滑动方向不一致造成的冲突(ViewPager中嵌套ListView)
滑动方向一致造成的冲突(竖直方向的scrollView嵌套多个竖直方向的ListView)
上述两种的综合
处理原则
对于滑动方向不一致造成的冲突,通常解决办法是通过代码判断用户滑动方向(通过水平和竖直方向的滑动距离大小比较判断滑动方向),如果是左右滑动,就交给ViewPager,如果是上下滑动就交给ListView;
对于滑动方向一致造成的冲突,这个场景只能根据业务逻辑进行活动冲突的解决。
什么是外部拦截?
通过重写父控件的onInterceptTouchEvent()方法,可以拦截事件继续传递。也就是:需要外层控件滑动的时候,进行拦截,需要内层控件滑动的时候,不进行拦截。
什么是内部拦截?
父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素要消耗此事件就直接消耗掉,否则就交由父容器进行处理,这种方法和Android中的事件分发机制不一致,需要配合requestDisallowInterceptTouchEvent方法才能正常工作,使用起来较外部拦截法稍显复杂。
Android自定义View系列经典教程 (https://blog.csdn.net/lfdfhl/article/details/51324275)
1,如何控制RecyclerView平滑滑动的速度