识别单个触摸VS移动触摸Android电子
我正在开发一个游戏2层的功能的一个被称为singleClick()和其他 moveClick(浮DX,DY浮动)识别单个触摸VS移动触摸Android电子
singleClick()从MotionEvent调用。 ACTION_UP
moveClick()从MotionEvent.ACTION_MOVE(其中dx = x轴previousX)
我的问题叫:如果我试图用我的手指一动的动作,只需点击一下也叫。反过来也是一样的,当我用手指点击某个东西时,moveClick()被调用。
我可以处理moveClick()在单击时被调用,但在玩家移动时调用singleClick()会真正使我的游戏控制失效。
我怎么知道哪个是哪个?
我在想这可能有些事情要花费触摸事件。在你的onclick监听器中记住,如果你返回true表示你已经消耗了该事件的信号,如果你返回false,那么该事件将继续下降并触发下一个监听器。
那么,如果你不想在玩家移动他碰到的地方时调用singleClick(),那么你不能从ACTION_UP调用singleClick,因为每次都会调用ACTION_UP。也许添加一个标志,记录它是否是一个移动事件。如果总欧几里德距离sqrt(dx^2 + dy^2)>阈值,则将标志isMove更改为true。如果总距离小于该阈值,则在ACTION_UP中调用singleClick()。
您可能还想要考虑定时触摸事件的时间长度或总绝对距离(即如果某人画了一个圆并返回第一个点,我以前的方法将注册为单击)。想想你想如何工作的标志。
我希望有一个优雅的解决方案,也许内置的Android开发..但我想没有,所以我采取了Benoir的建议,并写了这非常不雅的代码(这似乎工作得很好)
long millisLastTouch=0, millisDif,millisStartTouch=0;
final long minMillisSm = 200, minMillisBig = 300;
boolean isMove = true;
public void run(){//my main thread/loop
.....
millisDif = System.currentTimeMillis() - millisLastTouch;
if (!isMove && millisDif>minMillisBig) {
G.currentScreen.singleClick(mPreviousX,mPreviousY);
isMove = true;//to prevent multiple single clicks
}
.....
}//end of main loop
public boolean onTouchEvent(MotionEvent e) {
float x = e.getX(); float y = e.getY();
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN: { }//do nothing
case MotionEvent.ACTION_UP:{
mPreviousX = x; mPreviousY = y; }
case MotionEvent.ACTION_MOVE:{
boolean newAction;
millisDif = System.currentTimeMillis() - millisLastTouch;
if (millisDif> minMillisSm) {
newAction = true;
millisStartTouch = System.currentTimeMillis();
}
else newAction = false;
millisLastTouch = System.currentTimeMillis();
millisDif = System.currentTimeMillis() - millisStartTouch;
if (newAction == false && millisDif > minMillisSm){
float dx = x - mPreviousX; float dy = y - mPreviousY;
G.currentScreen.clickMove(x,y,dx,dy);
isMove = true;
}
else isMove = false;
mPreviousX = x; mPreviousY = y;
}
}//switch
return true;
}//onTouchEvent
它只是基于时间而不是距离。如果用户触摸屏幕足够长的时间,它将作为移动动作进行翻译。否则,它会记住x和y的位置,并会从主线程调用singleClick()