Trinea / android-auto-scroll-view-pager

Android auto scroll viewpager or viewpager in viewpager
http://p.codekk.com/
Apache License 2.0
1.67k stars 670 forks source link

为ViewPager的子View添加事件后,长按屏幕AutoScroll无法stop #5

Open lightSky opened 9 years ago

lightSky commented 9 years ago

群主好啊,最近使用你的AutoViewPager的时候,发现了一个小问题。 通常当手指按住屏幕的时候,是可以暂停滑动的。当我为ImageView(我的ViewPagerAdpter的Item是ImageView)设定了onClick事件的时候,用手指长按屏幕就无法暂停滑动了。

我的理解是这样的: 根据View事件的分发机制,Event是从ViewPager的dispatchTouchEvent开始的,当在ViewPager的onInterceptTouchEvent中没有返回true,也就没有拦截事件的时候,就会分发到ImageView中,由于为ImageView设置了onClick事件,所以在onTouchevent里面会执行onClick事件,从而消费掉了该事件,因此事件就不会返回到ViewPager的onTouchEvent中,也就无法处理相应的逻辑了。

我的解决方案是: 将ViewPager中onTouchEvent的逻辑放到dispatchTouchEvent或者onInterceptEvent中去,这样就可以先控制ViewPager的stop或者start了,然后再将事件传递到ImageView,让其自行处理。

上面的长按和onClick事件有点矛盾,下面是原因: 这里说下onClick和onLongClick,我通过log看到,即使你设置了onLongClick事件的处理,但是依旧会执行onClick事件,这是因为onLongClick事件默认返回了FALSE,事件没有消费掉,导致在action up的时候执行了onClick。所以也就是不管你是不是长按屏幕,都会执行onClick事件。也就是我长按屏幕时,事件被ImageView消费掉导致没法stop的原因。

在实际开发中,应该避免onClick和onLongClick同时触发的情况,所以在onLongClick方法里面返回FALSE,就可以了。当然这和上面的问题关联不是很大。

题外话: 看了下淘宝和携程还有网易音乐的广告栏 淘宝没有任何的限制,长按,或者move的时候,都可以继续轮循的。 携程的处理了move的情况,但没有处理长按的情况。 网易两种情况都处理了,并且onClick和onLongClick事件都响应了

这是我结合ViewPagerIndicator和你的AutoScrollViewPager而成的项目:https://github.com/lightSky/InfiniteAutoScroolView

Trinea commented 9 years ago

好长,这两天晚点我抽点时间看看,你也可以把修改的代码 push 过来

hloong commented 9 years ago

看了最新淘宝客户端长按还是继续轮播,是它故意这样设计的还是算一个bug?