Android轮播图的触摸事件分发问题

zippenL 2016-03-05 12:05:43
最近有个问题深深的困扰着我,请帮帮忙答复吧,我在设置无限轮播图时在ViewPager设置
viewpager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mRunTask.stop(); //轮播图停止轮播
System.out.println("------为啥不发生???");
break;
case MotionEvent.ACTION_CANCEL:
// 事件的取消
mRunTask.start();
break;
case MotionEvent.ACTION_UP:
mRunTask.start();

break;
default:
break;
}

return false; // viewPager 触摸事件 返回值要是false ,不然不能左右滑动
}
});
}
又在ViewPager的Adapter里, 在public Object instantiateItem(ViewGroup container, int position)方法里的view中设置了点击事件(onclick),这样轮播图中的view就可以拥有点击事件了。
但是一运行发现问题来了,ViewPager设置的OnTouchListener根本不响应,因为根本没有触发down事件(没有打印sysout这句话),一直按着轮播图,图片还是会自动切换下一页,松开手就会响应到轮播图里面view的onclick事件,但是如果按照viewGroup的事件分发机制,不是必定执行dispatchTouchEvent么?为啥ViewPager的OnTouch方法不会执行?难道说在viewGroup的父布局设置setOnTouchListener(new OnTouchListener() 是没效的?
...全文
272 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jklwan 2016-03-08
  • 打赏
  • 举报
回复
引用 8 楼 zzber 的回复:
我想问的是ViewPager的OnTouchListener的OnTouch事件是在ViewPager的dispatchTouchEvent事件里面的吗?如果是的话应该会执行里面的方法传递下去啊,最后由子view拦截。可是情况是子view拦截到了,证明没有拦截。但是ViewPager的OnTouch事件不触发,我就想问问ViewGroup究竟在执行dispatchTouchEvent时到底执不执行OnTouch事件哦?因为View的dispatchtouchEvent里面 是执行OnTouch事件的的,那么ViewGroup的OnTouch事件在哪一步执行的呢?注意,是OnTouch事件,不是OnTouchEvent!
你把viewpager的点击事件去掉你再看看效果呢
翼德兄 2016-03-08
  • 打赏
  • 举报
回复
只要是子view的点击事件生效了,父控件肯定就不会再去执行ontouch了,,在action_down的时候,被子view处理后,后续的事件都会传给子view处理。 dispatchTouchEvent 只是做分发判断,,它判断子view已经处理了事件了,就不会再把事件分给其它控件了。ontouch之前是有if判断的,并不一定执行。
jklwan 2016-03-07
  • 打赏
  • 举报
回复
上面回复错了,最好在dispatchTouchEvent或者onInterceptTouchEvent中做,不然onTouchEvent也可能不触发
jklwan 2016-03-07
  • 打赏
  • 举报
回复
点击的时候是不会触发的,只有滑动的时候会触发,这是和点击事件有关的,所以你只能在重写ViewPager的onTouchEvent事件,在onTouchEvent事件中设置是否自动滚动
zippenL 2016-03-07
  • 打赏
  • 举报
回复
引用 4 楼 yide55 的回复:
事件应该是已经被子view处理了,上层view要拦截处理应该在interrupt里
我想问的是ViewPager的OnTouchListener的OnTouch事件是在ViewPager的dispatchTouchEvent事件里面的吗?如果是的话应该会执行里面的方法传递下去啊,最后由子view拦截。可是情况是子view拦截到了,证明没有拦截。但是ViewPager的OnTouch事件不触发,我就想问问ViewGroup究竟在执行dispatchTouchEvent时到底执不执行OnTouch事件哦?因为View的dispatchtouchEvent里面 是执行OnTouch事件的的,那么ViewGroup的OnTouch事件在哪一步执行的呢?注意,是OnTouch事件,不是OnTouchEvent!
zippenL 2016-03-07
  • 打赏
  • 举报
回复
引用 6 楼 jklwan 的回复:
上面回复错了,最好在dispatchTouchEvent或者onInterceptTouchEvent中做,不然onTouchEvent也可能不触发
我想问的是ViewPager的OnTouchListener的OnTouch事件是在ViewPager的dispatchTouchEvent事件里面的吗?如果是的话应该会执行里面的方法传递下去啊,最后由子view拦截。可是情况是子view拦截到了,证明没有拦截。但是ViewPager的OnTouch事件不触发,我就想问问ViewGroup究竟在执行dispatchTouchEvent时到底执不执行OnTouch事件哦?因为View的dispatchtouchEvent里面 是执行OnTouch事件的的,那么ViewGroup的OnTouch事件在哪一步执行的呢?注意,是OnTouch事件,不是OnTouchEvent!
zippenL 2016-03-07
  • 打赏
  • 举报
回复
引用 3 楼 Mailbomb 的回复:
可以为里面的View注册onClickListener事件
已经注册了,问题是view的点击事件生效了,但是ViewPager的onTouch事件不生效,OnTouch事件不是在DispatchTouchEvent里面的么?注意,是OnTouch,不是OnTouchEvent,因为是实现了OnTouchListener事件,Listener事件返回false才会执行OnTouchEvent
翼德兄 2016-03-06
  • 打赏
  • 举报
回复
事件应该是已经被子view处理了,上层view要拦截处理应该在interrupt里
网络咖啡 2016-03-06
  • 打赏
  • 举报
回复
可以为里面的View注册onClickListener事件
zippenL 2016-03-05
  • 打赏
  • 举报
回复
引用 1 楼 xingzhong128 的回复:
switch (action & MotionEvent.ACTION_MASK) { 判断加上个mask试一下
其实我知道解决的办法,只是不明白为什么会响应不了触摸事件,这个违背了事件分发的原理啊。。。因为dispatchTouchEvent事件不是父布局也会执行的么? 我只是想知道原理啦,那你说说看为啥变成多点触控就可以了啊?能否用事件分发的角度说明一下呢?谢谢啦
xingzhong128 2016-03-05
  • 打赏
  • 举报
回复
switch (action & MotionEvent.ACTION_MASK) { 判断加上个mask试一下

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧