最近笔者在做项目的时候遇到一个问题,implements OnTouchListener中重写onTouch事件无法获取ACTION_DOWN中getX的值。
笔者想实现的效果:一个A页面,一个B页面(包含4个fragment的viewpager),viewpager可以实现fragment横滑切换,当fragment为0也就是第一个页面时,通过ontouch接口,在ACTION_DOWN获取用户点击屏幕的X距离StartX,再通过action_move获取用户滑动的距离SlipX,通过当StartX-SlipX>100,实现finish页面。再通过overridePendingTransition(int enterAnim, intexitAnim)设置进入,退出的动画,实现仿QQ横滑退出的效果。
;
问题描述:在ViewPager绑定onTouch事件中的ACTION_DOWN中无法获取getX的距离,然而action_move,action_up中确能够获取到getX的值。
好了,想必大家也明白了想要达到的效果以及遇到的问题,那么笔者也不废话了。直接说明出现此问题的原因,以及解决方案,最后当然是源码共享。
核心原因:对于(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent),以及onTouch这几个方法没有完全搞明白,以及其传递机制。于是本着严谨的态度,通过万能的互联网终于搞明白了这几个之间的关系,以及用法,下面这个图很好的说明了该问题。(后面我会贴出相关参考的帖子链接,大家有兴趣可以看一下).
1.首先onTouch方法是继承OnTouchListener接口需要重写的方法,当一个View绑定了该监听的时候,就会调用onTouch方法来监听用户对该View的手指操作.(什么是View?也就是一般的源生控件.例如button,textview,以本案例的viewpager都属于view或者自定义View).
mViewPager.setOnTouchListener(this);// 为ViewPager设置ontouch监听获取滚动距离
在这种情况下,如果我们在Activity里面为一个View控件绑定了setOnTouchListener,那么当屏幕有touch事件的时候,首先会是绑定该监听的View响应onTouch事件,执行onTouch方法.
如果onTouch返回值为true,表示这个touch事件被onTouch方法处理完毕,不会把touch事件再传递给Activity,也就是说activity的dispatchTouchEvent方法不会被调用,在本案例中,也就是viewpager就不会滑动了(有兴趣可以试一下)。
如果onTouch的返回值是false,表示这个touch事件没有被完全处理,onTouch返回以后,touch事件被传递给Activity,activity的dispatchTouchEvent方法被调用.
2.其次dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent,如下图所示,简单解释一下吧.