一个用来判断是长按手势的辅助类

来源:互联网 发布:编程显示九九乘法表 编辑:程序博客网 时间:2024/06/09 18:48

     一个用来判断是长按手势的辅助类

import android.content.Context;import android.os.Handler;import android.os.Looper;import android.view.MotionEvent;import android.view.ViewConfiguration;/** * Created by yyw on 2016/5/6. * 一个用来判断是长按手势的辅助类 */public class LongPressDetector {    //开始位置    private float srcX = 0;    //开始位置    private float srcY = 0;    //被判断为滑动的最小距离    private int minToScroll;    //被判断为长按的最小时间    private int minTimeToLongPress;    //当前的触摸事件    private MotionEvent currentEvent;    private DetectorHandler mHandler;    //回调接口    private OnLongPressListener longPressListener;    public LongPressDetector(Context context, OnLongPressListener longPressListener) {        minTimeToLongPress = ViewConfiguration.getLongPressTimeout();        minToScroll = ViewConfiguration.get(context).getScaledTouchSlop();        mHandler = new DetectorHandler(Looper.getMainLooper());        this.longPressListener = longPressListener;    }    /**     * 在{@link android.view.View#onTouchEvent(MotionEvent)}中调用该方法。     * 当手指在一个地方停留一段时间后会调用{@link OnLongPressListener#onLongPress(MotionEvent)}方法     * @param e MotionEvent     */    public void onTouchEvent(MotionEvent e) {        switch (e.getAction()) {            case MotionEvent.ACTION_DOWN:                currentEvent = MotionEvent.obtain(e);                mHandler.removeCallbacks(mLongPress);//清除动作                srcX = e.getX();//初始化位置信息                srcY = e.getY();                mHandler.postDelayed(mLongPress, minTimeToLongPress);//开始一个延时请求                break;            case MotionEvent.ACTION_MOVE:                float x = e.getX();                float y = e.getY();                if (Math.abs(srcX - x) > minToScroll || Math.abs(srcY - y) > minToScroll) {//判断当前的移动距离是否可以判断为滑动,如果是滑动就重置                    mHandler.removeCallbacks(mLongPress);                }                break;            case MotionEvent.ACTION_UP:                mHandler.removeCallbacks(mLongPress);//当手指抬起就清除动作                break;            case MotionEvent.ACTION_CANCEL:                mHandler.removeCallbacks(mLongPress);//当事件结束就清除动作                break;        }    }    private class DetectorHandler extends Handler {        public DetectorHandler(Looper looper) {            super(looper);        }    }    private Runnable mLongPress = new Runnable() {        @Override        public void run() {            if (longPressListener != null){                longPressListener.onLongPress(currentEvent);            }        }    };    public OnLongPressListener getLongPressListener() {        return longPressListener;    }    public void setLongPressListener(OnLongPressListener longPressListener) {        this.longPressListener = longPressListener;    }    /**     * 当手指在一个地方停留一段时间后会调用{@link OnLongPressListener#onLongPress(MotionEvent)}方法     */    public interface OnLongPressListener{        /**         * 当手指在一个地方停留一段时间后会调用{@link OnLongPressListener#onLongPress(MotionEvent)}方法         * @param e MotionEvent 当前的点击事件         */        void onLongPress(MotionEvent e);    }}


0 0
原创粉丝点击