android实现双击监听

原创 2017年01月03日 15:16:39

方案的优势:

1.灵活性高。不需要继承自View或者其子类。

2.对单击的误触进行了识别。

3.本身已经具备了双击,单击的识别机制,不必担心与原有接口的协调问题。

4.可调整单击与双击识别的时间值。


用法:

1.实例化VulcanTouchProcessor类。设置合适的监听器,以及双击的时间(单位毫秒)

2.在你的View(或者子类)的onTouch回调中调用VulcanTouchProcessor的notifyTouchUp方法

3.当双击事件触发,上述设定的监听器会被调用。


用法示例代码(其中的mTouchProcessor需要先行实例化):

        view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(MotionEvent.ACTION_UP == event.getAction()) {
                    mTouchProcessor.notifyTouchUp(v,null);
                }
                return true;
            }
        });




功能实现代码如下:

package com.vulcan.vulcan;

import android.os.Handler;
import android.os.Looper;
import android.view.View;

/**
 * Created by vulcan on 2016/12/30.
 */

public class VulcanTouchProcessor {
    public static final int STATUS_READY = 0;
    public static final int STATUS_GOING_TO_DOUBLE = 1;
    public static final int STATUS_SLEEP = 2;//in sleep status, we do not process any key.


    public static final long DEFAULT_DOUBLE_TAP_TIME_MS = 300;

    public VulcanTouchProcessor(VulcanTouchListener l) {
        mTouchListener = l;
    }

    public VulcanTouchProcessor(VulcanTouchListener l, long doubleTapTimeMs) {
        this(l);
        mTimeMsOfDoubleTap = doubleTapTimeMs;
    }

    public boolean notifyTouchUp(View v, Object extra) {
        mLastTouchedView = v;
        mExtraObject = extra;
        if(STATUS_READY == mStatus) {
            mStatus = STATUS_GOING_TO_DOUBLE;
            setTimer(mTimeMsOfDoubleTap);
            return true;
        }
        else if(STATUS_GOING_TO_DOUBLE == mStatus) {
            mStatus = STATUS_SLEEP;
            setTimer(mTimeMsOfSleep);
            mTouchListener.onDoubleClick(v, extra);
            return true;
        }
        else if(STATUS_SLEEP == mStatus) {
            return true;
        }
        return true;
    }

    private void notifyTimeout() {
        if(STATUS_READY == mStatus) {
            cancelTimer();
        }
        else if(STATUS_GOING_TO_DOUBLE == mStatus) {
            mTouchListener.onSingleClick(mLastTouchedView, mExtraObject);
            setTimer(mTimeMsOfSleep);
            mStatus = STATUS_SLEEP;
        }
        else if(STATUS_SLEEP == mStatus) {
            cancelTimer();
            mStatus = STATUS_READY;
        }

        return;
    }

    private void setTimer(long delayMs) {
        mHandler.removeCallbacks(mTimeoutCallback);
        mHandler.postDelayed(mTimeoutCallback, delayMs);
    }

    private void cancelTimer() {
        mHandler.removeCallbacks(mTimeoutCallback);
    }

    private Runnable mTimeoutCallback = new Runnable() {
        @Override
        public void run() {
            notifyTimeout();
        }
    };

    private long mTimeMsOfSleep = 250;
    private long mTimeMsOfDoubleTap = DEFAULT_DOUBLE_TAP_TIME_MS;
    private Object mExtraObject;
    private View mLastTouchedView;
    private int mStatus = STATUS_READY;
    private VulcanTouchListener mTouchListener;
    private Handler mHandler = new Handler(Looper.getMainLooper());
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android 处理双击事件监听

自定义一个监听类:public class OnDoubleClickListener implements View.OnTouchListener { private final String T...

android 监听控件的单机和双击事件

设置android的单击事件是很简单的,给控件设置 setOnClickListener,重写onClick方法()即可。    但是双击事件如何设置呢,可能大家比较容易想到的方法是重写onTouch...

TextView设置抗锯齿,及其他常用的一些属性设置

你不知道的TextView
  • sky_pjf
  • sky_pjf
  • 2016年10月24日 16:00
  • 1053

获得GPUImage处理后的UIImage

1:     UIImage *inputImage = [UIImage imageNamed:@"test.jpg"];          GPUImagePicture *st...

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

关于view的双击事件,网上有很多demo使用GestureDetector ,在给view setOnTouchListener的时候插入。我试了下,onDoubleTap onSingleTap等...

Android 实现双击

  • 2014年06月27日 14:19
  • 1014KB
  • 下载

javaGUI中 随机生成一组位置不同的按钮 并对JButton的左键、右键、双击的监听

public static int[][] getRandomLocation(int paneWidth,int panelHeight,int n,int blcokWidth,int block...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android实现双击监听
举报原因:
原因补充:

(最多只允许输入30个字)