您的位置 首页 发布

Android开发:在onTouchEvent中处理恣意时刻的长按

Android提供了GestureDetector类来处理一些常用的手势操作,比如说 onLongPress,onFling 等。但这里不使用GestureDetector,而是直接在自定义View

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{

//移动形式所做的事

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/321285.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部