android GridView 长按事件不管用
16lz
2021-01-26
问题:一个Gridiew的拖拽应用 在模拟器上 运行的没有一点问题
当我部署到平板电脑上 长按事件 不起作用了
研究:
Java代码
我的Gridview的父类的onInterceptTouchEvent 是这样写的
在模拟器是没有问题的
我就想down up 我都向下传 但是move我会截获 进行一些操作
但是 在平板上 就出现问题了
onItemLongClick事件 根本就没有执行
后来 调试的时候 我发现
在平板电脑上长按时 down总是伴随着move
也就是说 onItemLongClick没有执行的原因就是这个move事件 里面我是return true的
解决:
1、建一个静态变量
//是否可以移动
Java代码
2、修改onInterceptTouchEvent
Java代码
3、在onItemLongClick里面改变isMove的值
Java代码
4、在onTouchEvent up时改过来
Java代码
结论:
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
当我部署到平板电脑上 长按事件 不起作用了
研究:
Java代码
- publicbooleanonInterceptTouchEvent(MotionEventev){
- //这时候你得到的x,y是在DragLayer下面得到的这时候容器就是DragLayer了
- intx=(int)ev.getX();
- inty=(int)ev.getY();
- switch(ev.getAction()){
- caseMotionEvent.ACTION_DOWN:
- System.out.println("onInterceptTouchEventdown");
- returnfalse;
- caseMotionEvent.ACTION_MOVE:
- System.out.println("onInterceptTouchEventmove");
- returnture;
- caseMotionEvent.ACTION_UP:
- System.out.println("onInterceptTouchEventup");
- System.out.println(111);
- returnfalse;
- }
- returnsuper.onInterceptTouchEvent(ev);
- }
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、建一个静态变量
//是否可以移动
Java代码
- publicstaticbooleanisMove=false;
public static boolean isMove = false;
2、修改onInterceptTouchEvent
Java代码
- publicbooleanonInterceptTouchEvent(MotionEventev){
- //这时候你得到的x,y是在DragLayer下面得到的这时候容器就是DragLayer了
- intx=(int)ev.getX();
- inty=(int)ev.getY();
- switch(ev.getAction()){
- caseMotionEvent.ACTION_DOWN:
- System.out.println("onInterceptTouchEventdown");
- returnfalse;
- caseMotionEvent.ACTION_MOVE:
- System.out.println("onInterceptTouchEventmove");
- break;
- caseMotionEvent.ACTION_UP:
- System.out.println("onInterceptTouchEventup");
- System.out.println(111);
- returnfalse;
- }
- returnStaticConstant.isMove;
- }
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的值
Java代码
- StaticConstant.isMove=true;
StaticConstant.isMove = true;
4、在onTouchEvent up时改过来
Java代码
- StaticConstant.isMove=false;
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
更多相关文章
- Android(安卓)动态添加按钮,并获取id,添加事件
- android studio 快捷键(本文持续更新)
- JNI和NDK编程(一)
- Android实现蒙板效果
- Android:Click,LongClick,Touch,KeyDown,KeyUp事件使用心得
- RoboGuice logo Android上的Guice RoboGuice
- 【Android】代码开启/关闭GPS
- android 调试跟踪framework层代码
- Android(安卓)JNI代码