ViewPager 与子view的滑动冲突
在上一次笔记中建设了一个可以滑动的photoView,显示图片,可以放大,滑动
大部分时候这个自定义View会和ViewPager一起使用。也就是我们通常看到的相册里面的效果,滑动可以显示不同的图片。而在单页中,很多时候也需要滑动。这时候会和ViewPager产生冲突。
最后的结果就是,横向滑动并不会滑动子view里面的内容,而是切换ViewPager的页面。
那么如何才能禁止切换页面,而是只滑动子View呢。
1,可以自定义ViewPager,然后覆盖里面的一个方法canScroll()
answer on stackoverflow
2,一般情况我们是自定义一个View,并且希望这个View能够更加简单自由的使用,不需要被安装到viewpager的时候需要特别的设置,那么就需要在这个自定义View里面来确定让父View(不管是什么)不要拦截onTouch操作
那么,可以在子View的合适地方这样设置
getParent().requestDisallowInterceptTouchEvent(true)
这样,就不会拦截触摸操作,子View就可以获得触摸事件
比如PhotoView里面,如果横向可以滑动,并且没有滑动到边缘的时候,就设置一个这个,那么就可以自由横向滑动。如果滑动到横向边缘了,就设置成false
,就可以让ViewPager切换
是不是很容易!
补充
有一个问题需要说明一下
如果子View禁止父View传递onTouchEvent以后,是不会获得接下来的任何父View事件的
比如在移动中监测图片边界出现在屏幕内,就会禁止传递触摸事件,然后ViewPager就会滑动切换页面。
但是PhotoView组件需要监测一个UP事件来完成图片的移动,这时候会监测不到UP事件
但是会获得一个Cancel事件。
所以,在和ViewPager配合的时候,有些UP事件需要放到Cancel里面来做,或者在Cancel里面调用up事件。
如果希望能让子View和ViewPager在某些时候同时获得触摸事件,可能需要定制一下,具体做法还没有弄明白。