转: http://www.maxiaoguo.com/shipin/328.html

在listview的head上添加一个gallery    当左右滑动gallery的时候禁止listview上下滑动 


重写listview的  onInterceptTouchEvent(MotionEvent ev) 方法

其中touchView是gallery的items


@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean result = super.onInterceptTouchEvent(ev);
if(getFirstVisiblePosition()==0){
if(touchView!=null){
Rect rect = new Rect(touchView.getLeft(),touchView.getTop(),touchView.getRight(),touchView.getBottom());
if(rect.contains((int)ev.getX(), (int)ev.getY())){
result = false;
}
}
}
return result;
}


2012 12-19   更新 

我在项目中加了viewpage 之后,发现上边的加的代码不管用了,原因是viewpage 搞的鬼, 导致子的view  的ontouch 方法 不走了。

解决方法


@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
viewPager.requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(ev);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
viewPager.requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
viewPager.requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(event);
}

这样就可以滑动了,搞了一天了终于解决了


顺便学习下touch的时候调用的一些方法

牛人的分析--------------------------------!!!!!!!!!!!!!!!!
android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP
当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是ViewGroup来处理Touch事件,还是子view来处理Touch事件呢?我只能很肯定的对你说不一定。呵呵,为什么呢?看看下面我的调查结果你就明白了。
android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev)  这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent

当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由  dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。

详细的解决方案:

http://www.eoeandroid.com/thread-153696-1-1.html


2012-12-21 更新  

viewpage 跟子veiw的冲突问题最后的解决方案 

一, 

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean result = super.onInterceptTouchEvent(ev);
if(getFirstVisiblePosition()==0){
if(gallery!=null){
Rect rect = new Rect(gallery.getLeft(),gallery.getTop(),gallery.getRight(),gallery.getBottom());
if(rect.contains((int)ev.getX(), (int)ev.getY())){
result = false;
}
}
}
return result;
}


2,重写gallery 的时候 拦截下   意思是不让 viewpage 捕获触摸事件

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(viewPage!=null){
viewPage.requestDisallowInterceptTouchEvent(true);
}
return super.onTouchEvent(ev);
}


这样就ok 了。。。。 但是 gallery是能滑动了,但是不能点击,。。。。为什么呢。。。。 同事说,gallery拿到焦点了,所以gallery中的items 就拿不到了,这样gallery 中的items 中的某一个view 只能通过重写gallery 再ontouch事件来做了。。






更多相关文章

  1. RatingBar的使用方法
  2. listview中放Button 点击 长按事件
  3. Android事件分发机制解析
  4. Android: Gallery的adapter中getView方法被执行多次
  5. Android(安卓)ViewDragHelper使用介绍
  6. 事件分发系列—View中的dispatchTouchEvent和onTouchEvent分析
  7. android IPlog的抓取方法
  8. android WebViewClient和WebChromeClient
  9. 扩大View的点击区域

随机推荐

  1. androidのPULL方式解析XML
  2. 专项测试(三)内存泄漏调试经验分享 (一)
  3. Android(安卓)1.5 1.6 2.0 2.1 2.2区别
  4. Android(安卓)测量文字宽高
  5. 用U盘安装Android系统在PC x86平台上运行
  6. android小白感悟:Android Studio安装与配
  7. Android的内存泄露测试 mat
  8. Android防重签名和二次打包
  9. [笨木头Cocos2dx045]让输入框在Android上
  10. Android安全机制介绍