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. listview 左滑弹出删除按钮,需要折腾一下
  2. 【Android】事件分发机制
  3. Android事件传递机制
  4. android监听事件添加动作的三种方式
  5. android 借助AccessibilityService实现模拟点击功能-几个工具类(
  6. Android(安卓)编程下 Touch 事件的分发和消费机制
  7. Android(安卓)点击事件分发
  8. Android(安卓)编程下 Touch 事件的分发和消费机制
  9. Android修行之路——Android程序设计基础(一)

随机推荐

  1. [转]Html position(static、relative、abs
  2. 零基础HTML5游戏制作教程 第3章 图形的移
  3. MonoRail学习笔记十三:NVelocity的增强功
  4. [模仿]html5游戏_别踩白块
  5. 的良好实践是什么?它可以替换还是只用于
  6. HTML5的重点知识小结——整体布局(浮动布
  7. 浏览器加载和渲染html的顺序
  8. 用正则表达式剔除文本里面HTML标记
  9. UpdateResource(增加、删除或替代某可执
  10. HTML中的自定义HTTP请求标头