2011.07.01——— android GridView 长按事件不管用
参考:http://lipeng88213.iteye.com/admin/blogs/1102048

问题:一个Gridiew的拖拽应用 在模拟器上 运行的没有一点问题
当我部署到平板电脑上 长按事件 不起作用了
研究:
public boolean onInterceptTouchEvent(MotionEvent ev) {        //这时候 你得到的x,y是在DragLayer下面得到的 这时候 容器 就是DragLayer了        int x = (int)ev.getX();        int y = (int)ev.getY();                switch(ev.getAction()){            case MotionEvent.ACTION_DOWN:                System.out.println("onInterceptTouchEvent down");                return false;            case MotionEvent.ACTION_MOVE:                System.out.println("onInterceptTouchEvent move");                return ture;            case MotionEvent.ACTION_UP:                System.out.println("onInterceptTouchEvent up");                System.out.println(111);                return false;        }        return super.onInterceptTouchEvent(ev);    }


我的Gridview的父类的onInterceptTouchEvent 是这样写的

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

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

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

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

解决:

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

2、修改onInterceptTouchEvent
public boolean onInterceptTouchEvent(MotionEvent ev) {        //这时候 你得到的x,y是在DragLayer下面得到的 这时候 容器 就是DragLayer了        int x = (int)ev.getX();        int y = (int)ev.getY();                switch(ev.getAction()){            case MotionEvent.ACTION_DOWN:                System.out.println("onInterceptTouchEvent down");                return false;            case MotionEvent.ACTION_MOVE:                System.out.println("onInterceptTouchEvent move");                break;            case MotionEvent.ACTION_UP:                System.out.println("onInterceptTouchEvent up");                System.out.println(111);                return false;        }        return StaticConstant.isMove;    }

3、在onItemLongClick里面改变isMove的值
StaticConstant.isMove = true;

4、在onTouchEvent up时改过来
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







更多相关文章

  1. Android的事件转递机制
  2. Android Notification通知栏、点击事件、悬浮通知的简单实现
  3. 【转载】Android事件分发机制完全解析,带你从源码的角度彻底理解(
  4. Android Input输入系统之一:KeyEvent事件监听
  5. Android事件总线 浅谈 EventBus
  6. 电脑通过vnc控制android 手机
  7. Android防止过快点击造成多次事件执行(防止按钮重复点击)

随机推荐

  1. Android(安卓)8.1 MTK6739修改文档
  2. Android 倒计时广告与广告轮播
  3. Android编译系统详解(二)——命令执行流
  4. Android(安卓)Go 8.1.0 在Setting中菜单
  5. Android SwipeRefreshLayout 下拉刷新组
  6. android os耗电量巨大的问题
  7. android 操作命令
  8. BufferQueue 学习总结(内附动态图)
  9. github上十二款Android播放器开源项目
  10. 视频播放器丢帧策略