Android GridView 长按事件不管用


问题:一个Gridiew的拖拽应用 在模拟器上 运行的没有一点问题
当我部署到平板电脑上 长按事件 不起作用了
研究:
Java代码
  1. public boolean onInterceptTouchEvent(MotionEvent ev) {   
  2.         //这时候 你得到的x,y是在DragLayer下面得到的 这时候 容器 就是DragLayer了   
  3.         int x = (int)ev.getX();   
  4.         int y = (int)ev.getY();   
  5.            
  6.         switch(ev.getAction()){   
  7.             case MotionEvent.ACTION_DOWN:   
  8.                 System.out.println("onInterceptTouchEvent down");   
  9.                 return false;   
  10.             case MotionEvent.ACTION_MOVE:   
  11.                 System.out.println("onInterceptTouchEvent move");   
  12.                 return ture;   
  13.             case MotionEvent.ACTION_UP:   
  14.                 System.out.println("onInterceptTouchEvent up");   
  15.                 System.out.println(111);   
  16.                 return false;   
  17.         }   
  18.         return super.onInterceptTouchEvent(ev);   
  19.     }  
 
  1. public boolean onInterceptTouchEvent(MotionEvent ev) {  
  2.         //这时候 你得到的x,y是在DragLayer下面得到的 这时候 容器 就是DragLayer了   
  3.         int x = (int)ev.getX();  
  4.         int y = (int)ev.getY();  
  5.           
  6.         switch(ev.getAction()){  
  7.             case MotionEvent.ACTION_DOWN:  
  8.                 System.out.println("onInterceptTouchEvent down");  
  9.                 return false;  
  10.             case MotionEvent.ACTION_MOVE:  
  11.                 System.out.println("onInterceptTouchEvent move");  
  12.                 return ture;  
  13.             case MotionEvent.ACTION_UP:  
  14.                 System.out.println("onInterceptTouchEvent up");  
  15.                 System.out.println(111);  
  16.                 return false;  
  17.         }  
  18.         return super.onInterceptTouchEvent(ev);  
  19.     }  
我的Gridview的父类的onInterceptTouchEvent 是这样写的

在模拟器是没有问题的
我就想down up 我都向下传 但是move我会截获 进行一些操作

但是 在平板上 就出现问题了
onItemLongClick事件 根本就没有执行

后来 调试的时候 我发现
在平板电脑上长按时 down总是伴随着move

也就是说 onItemLongClick没有执行的原因就是这个move事件 里面我是return true的

解决:

1、建一个静态变量
   //是否可以移动
    Java代码
  1. public static boolean isMove = false;  
 
  1. public static boolean isMove = false;  

2、修改onInterceptTouchEvent
Java代码 复制代码 收藏代码
  1. public boolean onInterceptTouchEvent(MotionEvent ev) {   
  2.         //这时候 你得到的x,y是在DragLayer下面得到的 这时候 容器 就是DragLayer了   
  3.         int x = (int)ev.getX();   
  4.         int y = (int)ev.getY();   
  5.            
  6.         switch(ev.getAction()){   
  7.             case MotionEvent.ACTION_DOWN:   
  8.                 System.out.println("onInterceptTouchEvent down");   
  9.                 return false;   
  10.             case MotionEvent.ACTION_MOVE:   
  11.                 System.out.println("onInterceptTouchEvent move");   
  12.                 break;   
  13.             case MotionEvent.ACTION_UP:   
  14.                 System.out.println("onInterceptTouchEvent up");   
  15.                 System.out.println(111);   
  16.                 return false;   
  17.         }   
  18.         return StaticConstant.isMove;   
  19.     }  
 
  1. public boolean onInterceptTouchEvent(MotionEvent ev) {  
  2.         //这时候 你得到的x,y是在DragLayer下面得到的 这时候 容器 就是DragLayer了   
  3.         int x = (int)ev.getX();  
  4.         int y = (int)ev.getY();  
  5.           
  6.         switch(ev.getAction()){  
  7.             case MotionEvent.ACTION_DOWN:  
  8.                 System.out.println("onInterceptTouchEvent down");  
  9.                 return false;  
  10.             case MotionEvent.ACTION_MOVE:  
  11.                 System.out.println("onInterceptTouchEvent move");  
  12.                 break;  
  13.             case MotionEvent.ACTION_UP:  
  14.                 System.out.println("onInterceptTouchEvent up");  
  15.                 System.out.println(111);  
  16.                 return false;  
  17.         }  
  18.         return StaticConstant.isMove;  
  19.     }  
3、在onItemLongClick里面改变isMove的值
Java代码
  1. StaticConstant.isMove = true;  
 
  1. StaticConstant.isMove = true;  
4、在onTouchEvent up时改过来
Java代码
  1. StaticConstant.isMove = false;  
 
  1. StaticConstant.isMove = false;  
结论:

GridVie onItemLongClick
按理说 只会触发 down
但是 在平板电脑中 当你触摸时 不可避免的会有move事件的

那么 为什么是 down move 后再onItemLongClick呢?

如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。

注意 是之后和down一起传递下去

因为move紧跟着就发生了 所以 会和down一起传递给子view

所以 顺序是 down move move..... onItemLongClick


经测试 结论如下:
在平板电脑上:
onItemLongClick事件: down move LongClick up
onItemClick事件: down move up click

在模拟器上:
onItemLongClick事件: down  LongClick up
onItemClick事件: down  up click

相关内容