Android Touch事件传递机制详解

Android必知必会-获取View坐标和长宽的时机

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平滑滑动的速度

results matching ""

    No results matching ""