Android供给了GestureDetector类来处理一些常用的手势操作,比如说 onLongPress,onFling 等。但这儿不运用GestureDetector,而是直接在自定义View重写的onTouchEvent中进行处理。
欲完成的作用是:当手机按住屏幕时,假如在指定的时刻内没有移动(如500毫秒),那么进入长按形式,此刻手指在屏幕上移动都算作长按形式。假如手机按住屏幕就立马移动,那么就算作移动形式。
MotionEvent 类供给了记载当时坐标的函数(getX(),getY())和当时事情发生的时刻的函数(getEventTime())以及按下时刻(getDowntime())。MotionEvent一起也供给了当时的操作类型,按下(ACTION_DOWN)、 移动 (ACTION_MOVE)、弹起 (ACTION_UP)。有了这些参数,咱们便能够简单的完成想要的作用了。
大约思路如下:在按下时记载x,y坐标以及按下时刻,当第一次移动的时分获取移动的时刻,假如大于指定的长准时刻,那么进入长按形式,不然便是一般的移动形式。很简单,在模拟器里边完成了这个作用,可是当在真机里边运行时,却无法完成这样的作用。本来模拟器点击的时分能够确保在不移动鼠标的状况下不触发ACTION_MOVE,可是真机却很灵敏,几乎在ACTION_DOWN后的几毫秒之后就立马不断的ACTION_MOVE了。想了一下,其实只需略微变通下变能够在真机上也完成相同的作用了。那便是判别ACTION_MOVE后的坐标和ACTION_DOWN的坐标的偏移值是否小于咱们指定的偏移像素,假如在指定值内,那么以为没有移动。所以有了如下这个函数。
private boolean isLongPressed(float lastX,float lastY,
float thisX,float thisY,
long lastDownTime,long thisEventTime,
long longPressTime){
float offsetX = Math.abs(thisX – lastX);
float offsetY = Math.abs(thisY – lastY);
long intervalTime = thisEventTime – lastDownTime;
if(offsetX =10 offsetY=10 intervalTime >= longPressTime){
return true;
}
return false;
}
在ACTION_DOWN的时分,记载下lastX,lastY和lastDownTime,在ACTION_MOVE的时分判别当时是否为长按形式(类标志变量的方法),假如不是,那么获取当时的thisX,thisY和thisEventTime调用函数进行判别。最终别忘记在ACTION_UP里将长按标志值为FALSE。ACTION_UP里边这样处理:
//检测是否长按,在非长准时检测
if(!mIsLongPressed){
mIsLongPressed = isLongPressed(mLastMotionX, mLastMotionY, x, y, lastDownTime,eventTime,500);
}
if(mIsLongPressed){
//长按形式所做的事
}else{
//移动形式所做的事
}