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

关于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
有心课堂,传递给你的不仅仅是技术

你可能感兴趣的:(Android,Demo)