Android view的单击,双击,长按事件监听

时间:2021-06-01 22:35:33

关于view的双击事件,网上有很多demo使用GestureDetector ,在给view setOnTouchListener的时候插入。我试了下,onDoubleTap onSingleTap等几个方法都没有被调用到。而在Activity的onTouchEvent插入GestureDetector ,则完美调用各个手势事件。可是我们要设置单击,双击,长按事件的对象是view啊,不是Activity。
有些方案是在记录ACTION_DOWN到ACTION_UP的时间,单击和双击都能很好的记录,然后长按呢,你会发现只有在你手指抬起,也就是ACTION_UP的时候才开始算是长按!!!!! 这跟我要的效果不一样啊!!!

此次我们讨论的是用另一种方法来实现这3种事件监听——定时判断

package com.draftbox.touch_demo;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.draftbox.R;

public class TouchDemoActivity extends AppCompatActivity implements View.OnTouchListener {

TextView touchRl;
private long firstClickTime;
private long secondClickTime;
private long stillTime;
private boolean isUp=false;
private boolean isDoubleClick=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_touch_demo);
touchRl= (TextView) findViewById(R.id.rl_touch_area);
touchRl.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
isUp=false;
if(firstClickTime==0&secondClickTime==0){//第一次点击
firstClickTime=System.currentTimeMillis();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if(!isUp){
Toast.makeText(TouchDemoActivity.this, "长按", Toast.LENGTH_SHORT).show();
firstClickTime=0;
secondClickTime=0;
isDoubleClick=false;
}else {
if(!isDoubleClick){
Toast.makeText(TouchDemoActivity.this, "点击", Toast.LENGTH_SHORT).show();
}
isDoubleClick=false;
firstClickTime=0;
secondClickTime=0;
}
}
}, 500);

}else {
secondClickTime=System.currentTimeMillis();
stillTime =secondClickTime-firstClickTime;
if ( stillTime < 500) {//两次点击小于0.5秒
Toast.makeText(this, "双击", Toast.LENGTH_SHORT).show();
isDoubleClick=true;
firstClickTime=0;
secondClickTime=0;
}
}
break;
case MotionEvent.ACTION_UP:
isUp=true;
break;
}
return true;
}
}

主要实现方案,定义两个long类型参数记录第一次,第二次点击的时间
双击:两次点击事件不超过0.5秒(该时间可按需求调节)
长按:第一次点击后,搞个定时器0.5秒后去判断,手指是否抬起了,没抬起则为长按
单击:不是上面两种情况,那就是单击了呗
PS :随手写的小demo,可能判断起来不是很严谨,不过3种事件我都试过了,完美运行,应该没多大问题。建议读者可以自己按自己逻辑,自己理解动手写下,每个人的实现方案都不一样,我认为——所谓的最优解还是自己根据业务逻辑写出来的代码,而不是照搬别人的。

最后打下小广告~
有心课堂交流群 183899857
有心课堂,传递给你的不仅仅是技术