onTouchEvent 有么有(单击,双击,三击)事件? Hi~如题:onTouchEvent 有么有(单击,双击,三击)事件?在TextView屏幕按触摸中需要触发三种情况。是否有法子可实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以在网上看看相关资料: onTouchEvent中要处理的最常用的3个事件就是:ACTION_DOWN、ACTION_MOVE、ACTION_UP。 这三个事件标识出了最基本的用户触摸屏幕的操作,含义也很清楚。虽然大家天天都在用它们,但是有一点请留意,ACTION_DOWN事件作为起始事件,它的重要性是要超过ACTION_MOVE和ACTION_UP的,如果发生了ACTION_MOVE或者ACTION_UP,那么一定曾经发生了ACTION_DOWN。 从Android的源代码中能看到基于这种不同重要性的理解而实现的一些交互机制,SDK中也有明确的提及,例如在ViewGroup的onInterceptTouchEvent方法中,如果在ACTION_DOWN事件中返回了true,那么后续的事件将直接发给onTouchEvent,而不是继续发给onInterceptTouchEvent。onTouchEvent是最先捕捉到ACTION_DOWN和ACTION_UP事件的,其次才可能触发onClick或者onLongClick。主要的逻辑在View.java中的onTouchEvent方法中实现的 没有一般是实现ontouch。根据ondown onmove oncancel onup来判断执行各类操作 判断的时间用哪个? downtime or eventtime 还是用其它的哪个?没找到好法子。 int up = 0; int down = 0; int move = 0; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: down++; break; case MotionEvent.ACTION_MOVE: move++; break; case MotionEvent.ACTION_UP: up++; break; default: break; } System.out.println("DOWN:" + down + " MOVE:" + move + " UP:" + up); if (up == 3 && down == 3 && move == 0) { up = 0; move = 0; down = 0; System.out.println("3 Clicked"); } if (up == 2 && down == 2 && move == 0) { up = 0; move = 0; down = 0; System.out.println("2 Clicked"); } if (up == 1 && down == 1 && move == 0) { up = 0; move = 0; down = 0; System.out.println("1 Clicked"); } if (up == 1 && down == 1 && move > 0) { up = 0; move = 0; down = 0; System.out.println("it's moved"); } System.out.println(""); return super.onTouchEvent(event); }试着写了模拟,用那种方式截取一个事件结束了? onTouchEvent中只有action_down action_up action_move三种事件,而且都是单击,如果想实现双击 三击,可以设置两次或三次单击事件的时间差来判断是否双击或三击。 int moveType;int MOVE_V = 2public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: moveType = 0; break; case MotionEvent.ACTION_MOVE: if (event.getHistorySize() > 0) { float hx = event.getHistoricalX(0); float hy = event.getHistoricalY(0); float distanceX = Math.abs(x - hx); float distanceY = Math.abs(y - hy); if (Math.max(distanceX, distanceY) > 14) { moveType = distanceY > distanceX ? MOVE_V : MOVE_H; } else { Log.i("ACTION_MOVE", moveType + ",d:" + Math.max(distanceX, distanceY)); } } break; case MotionEvent.ACTION_UP: if (moveType < MOVE_V) { long currTime = System.currentTimeMillis(); if (currTime - clickTime < 300) { Activity activity = (Activity)view.getContext(); Intent intent = new Intent(activity, KingLine.class); activity.startActivity(intent); } clickTime = currTime; } break; } 这是从那个了粘贴过来的吧!如果发生了ACTION_MOVE或者ACTION_UP,那么一定曾经发生了ACTION_DOWN。这里结论你们测试了没?如果是Gallery空间的话,在它的父View中重载onTouchEvent()函数的话,只发生ACTION_MOVE,并不发生ACTION_DOWN。 使用AsyncTask更新listView加载图片的问题 让自定义View中的onDraw方法不重复执行 非纯色图片放在surfaceView 的video上面,在真机上被挖空显示播放画面图片 求Android2.3.5 Launcher2 源码 关于android中的overlay系统 关于用NDK编译C 请问如何用java对/cache目录进行读写操作 Android 蓝牙连接时候那个弹出框是怎么实现的? 关于使用极光推送的客户端设置是否接收通知的问题 关于动态获取页面高度和滚动条定位的问题求解 初学android的问题 JSON数据解析的问题,请高手帮忙
onTouchEvent中要处理的最常用的3个事件就是:ACTION_DOWN、ACTION_MOVE、ACTION_UP。 这三个事件标识出了最基本的用户触摸屏幕的操作,含义也很清楚。虽然大家天天都在用它们,但是有一点请留意,ACTION_DOWN事件作为起始事件,它的重要性是要超过ACTION_MOVE和ACTION_UP的,如果发生了ACTION_MOVE或者ACTION_UP,那么一定曾经发生了ACTION_DOWN。 从Android的源代码中能看到基于这种不同重要性的理解而实现的一些交互机制,SDK中也有明确的提及,例如在ViewGroup的onInterceptTouchEvent方法中,如果在ACTION_DOWN事件中返回了true,那么后续的事件将直接发给onTouchEvent,而不是继续发给onInterceptTouchEvent。
onTouchEvent是最先捕捉到ACTION_DOWN和ACTION_UP事件的,其次才可能触发onClick或者onLongClick。主要的逻辑在View.java中的onTouchEvent方法中实现的
判断的时间用哪个?
downtime or eventtime 还是用其它的哪个?
没找到好法子。
int down = 0;
int move = 0; @Override
public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
down++;
break;
case MotionEvent.ACTION_MOVE:
move++;
break;
case MotionEvent.ACTION_UP:
up++;
break; default:
break; } System.out.println("DOWN:" + down + " MOVE:" + move + " UP:" + up);
if (up == 3 && down == 3 && move == 0) {
up = 0; move = 0; down = 0;
System.out.println("3 Clicked");
}
if (up == 2 && down == 2 && move == 0) {
up = 0; move = 0; down = 0;
System.out.println("2 Clicked");
} if (up == 1 && down == 1 && move == 0) {
up = 0; move = 0; down = 0;
System.out.println("1 Clicked");
}
if (up == 1 && down == 1 && move > 0) {
up = 0; move = 0; down = 0;
System.out.println("it's moved");
}
System.out.println(""); return super.onTouchEvent(event);
}
试着写了模拟,用那种方式截取一个事件结束了?
onTouchEvent中只有action_down action_up action_move三种事件,而且都是单击,如果想实现双击 三击,可以设置两次或三次单击事件的时间差来判断是否双击或三击。
int MOVE_V = 2
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
moveType = 0;
break;
case MotionEvent.ACTION_MOVE:
if (event.getHistorySize() > 0) {
float hx = event.getHistoricalX(0);
float hy = event.getHistoricalY(0);
float distanceX = Math.abs(x - hx);
float distanceY = Math.abs(y - hy); if (Math.max(distanceX, distanceY) > 14) {
moveType = distanceY > distanceX ? MOVE_V : MOVE_H;
} else {
Log.i("ACTION_MOVE", moveType + ",d:" + Math.max(distanceX, distanceY));
}
}
break;
case MotionEvent.ACTION_UP:
if (moveType < MOVE_V) {
long currTime = System.currentTimeMillis();
if (currTime - clickTime < 300) {
Activity activity = (Activity)view.getContext();
Intent intent = new Intent(activity, KingLine.class);
activity.startActivity(intent);
}
clickTime = currTime;
}
break;
}
这是从那个了粘贴过来的吧!如果发生了ACTION_MOVE或者ACTION_UP,那么一定曾经发生了ACTION_DOWN。
这里结论你们测试了没?如果是Gallery空间的话,在它的父View中重载onTouchEvent()函数的话,只发生ACTION_MOVE,并不发生ACTION_DOWN。