android中根据touch事件判断单击及双击

private static final int MAX_INTERVAL_FOR_CLICK = 250;
    private static final int MAX_DISTANCE_FOR_CLICK = 100;
    private static final int MAX_DOUBLE_CLICK_INTERVAL = 500;
    int mDownX = 0;
    int mDownY = 0;
    int mTempX = 0;
    int mTempY = 0;
    boolean mIsWaitUpEvent = false;
    boolean mIsWaitDoubleClick = false;
    Runnable mTimerForUpEvent = new Runnable() {
        public void run() {
            if (mIsWaitUpEvent) {
                Log.d(LOG_TAG,
                        "The mTimerForUpEvent has executed, so set the mIsWaitUpEvent as false");
                mIsWaitUpEvent = false;
            } else {
                Log.d(LOG_TAG,
                        "The mTimerForUpEvent has executed, mIsWaitUpEvent is false,so do nothing");
            }
        }
    };

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (!mIsWaitUpEvent && event.getAction() != MotionEvent.ACTION_DOWN) {
            return super.onTouchEvent(event);
        }
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mDownX = (int) event.getX();
            mDownY = (int) event.getY();
            mIsWaitUpEvent = true;
            postDelayed(mTimerForUpEvent, MAX_INTERVAL_FOR_CLICK);
            break;
        case MotionEvent.ACTION_MOVE:
            mTempX = (int) event.getX();
            mTempY = (int) event.getY();
            if (Math.abs(mTempX - mDownX) > MAX_DISTANCE_FOR_CLICK
                    || Math.abs(mTempY - mDownY) > MAX_DISTANCE_FOR_CLICK) {
                mIsWaitUpEvent = false;
                removeCallbacks(mTimerForUpEvent);
                Log.d(LOG_TAG, "The move distance too far:cancel the click");
            }
            break;
        case MotionEvent.ACTION_UP:
            mTempX = (int) event.getX();
            mTempY = (int) event.getY();
            if (Math.abs(mTempX - mDownX) > MAX_DISTANCE_FOR_CLICK
                    || Math.abs(mTempY - mDownY) > MAX_DISTANCE_FOR_CLICK) {
                mIsWaitUpEvent = false;
                removeCallbacks(mTimerForUpEvent);
                Log.d(LOG_TAG,
                        "The touch down and up distance too far:cancel the click");
                break;
            } else {
                mIsWaitUpEvent = false;
                removeCallbacks(mTimerForUpEvent);
                onSingleClick();
                return super.onTouchEvent(event);
            }
        case MotionEvent.ACTION_CANCEL:
            mIsWaitUpEvent = false;
            removeCallbacks(mTimerForUpEvent);
            Log.d(LOG_TAG, "The touch cancel state:cancel the click");
            break;
        default:
            Log.d(LOG_TAG, "irrelevant MotionEvent state:" + event.getAction());
        }
        return super.onTouchEvent(event);
    }

    Runnable mTimerForSecondClick = new Runnable() {
        @Override
        public void run() {
            if (mIsWaitDoubleClick) {
                Log.d(LOG_TAG,
                        "The mTimerForSecondClick has executed,so as a singleClick");
                mIsWaitDoubleClick = false;
                // at here can do something for singleClick!!
            } else {
                Log.d(LOG_TAG,
                        "The mTimerForSecondClick has executed, the doubleclick has executed ,so do thing");
            }
        }
    };

    public void onSingleClick() {
        if (mIsWaitDoubleClick) {
            onDoubleClick();
            mIsWaitDoubleClick = false;
            removeCallbacks(mTimerForSecondClick);
        } else {
            mIsWaitDoubleClick = true;
            postDelayed(mTimerForSecondClick, MAX_DOUBLE_CLICK_INTERVAL);
        }
    }

    public void onDoubleClick() {
        Log.d(LOG_TAG,"we can do sth for double click here");
    }

android中根据touch事件判断单击及双击,布布扣,bubuko.com

时间: 2024-12-18 13:43:59

android中根据touch事件判断单击及双击的相关文章

Android 编程下 Touch 事件的分发和消费机制

Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev).onTouchEvent(MotionEvent ev):能够响应这些方法的控件包括:ViewGroup 及其子类.Activity.方法与控件的对应关系如下表所示: Touch 事件相关方法   方法功能     ViewGroup         Activity        public b

Android中TouchEvent触摸事件机制

当我们的手指在Android屏幕上点击或滑动时,就会触发触摸事件TouchEvent.在App中ViewGroup和View存在多级嵌套,在最外层的是Activity,最内层的View,介于Activity与View之间的是一些ViewGroup.本文为了简化讨论,我们假设一个Activity中只有一个ViewGroup,这个ViewGroup中只有一个View.当我们用手指触摸到View的UI时,就会产生触摸事件TouchEvent,总的过程如下图所示: 首先是最外层的Activity接收到该

windows phone和android,ios的touch事件兼容

1.开发背景 最近用html5写了个小游戏,中间踩过无数坑,有很多甚至百度都百度不到答案,可见html5还真是不成熟,兼容性的复杂度比ie6有过之而无不及,性能那个渣简直无力吐槽.. 好了,吐槽结束,虽然有这么多的缺点,但是由于其良好的跨平台前景以及极低的学习成本,再加上优秀的框架,我最终还是选择了用html5来开发这个小游戏,而且是小游戏,所以就没有用什么游戏开发框架了,只是自己简单的封装了一个,因此所有的bug都被我走了一遍..正当我调试完所有的android上的bug之后,心想自己的努力不

H5案例分享:移动端touch事件判断滑屏手势的方向

移动端touch事件判断滑屏手势的方向 方法一 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touchmove事件时,在获取此时手指的横坐标moveEndX和纵坐标moveEndY;最后,通过这两次获取的坐标差值来判断手指在手机屏幕上的滑动方向. 思路:用touchmove的最后坐标减去touchstart的起始坐标,X的结果如果正数,则说明手指是从左往右划动:X的结果如果负数,则说明手指是从右往左划动:Y的结果如果正数,则说明手指是从

cocos2d-x中关于touch事件的响应

原作者:有缘人  来源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.html 一.touch事件响应分为单点触摸响应和多点触摸响应. 单点触摸响应需要重载的方法: virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void

javascript移动设备Web开发中对touch事件的封装实例

在触屏设备上,一些比较基础的手势都需要通过对 touch 事件进行二次封装才能实现.zepto 是移动端上使用率比较高的一个类库,但是其 touch 模块模拟出来的一些事件存在一些兼容性问题,如 tap 事件在某些安卓设备上存在事件穿透的 bug,其他类型的事件也或多或少的存在一些兼容性问题. 于是乎,干脆自己动手对这些常用的手势事件进行了封装,由于没有太多真实的设备来进行测试,可能存在一些兼容性问题,下面的代码也只是在 iOS 7.Andorid 4 上的一些比较常见的浏览器中测试通过. ta

Android开发之Touch事件分发机制

原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在ViewGroup内,ViewGroup也可以在其他ViewGroup内,这时候把内部的ViewGroup当成View来分析. ViewGroup的相关事件有三个:onInterceptTouchEv

H5中的touch事件

touch中共有touchstart.touchmove和touchend三个事件: touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 并且每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点(用来实现多点触控): touches:当前位于屏幕上的所有手指的列表: targetTouches:位于当前DOM元素上的手指列表: changedTouches:涉及当前事件手指的列表. 每个触摸点由包含了如下

Android中处理Touch Icon的方案

苹果的Touch Icon相对我们都比较熟悉,是苹果为了支持网络应用(或者说网页)添加到桌面需要的图标,有了这些Touch Icon的网页链接更加和Native应用更相像了.由于苹果设备IPod,IPhone,IPad等设备广泛,很多网页都提供了touch icon这种图标资源.由于Android中并没有及早的有一份这样的标准,当我们想把网页添加到桌面时,仍然需要使用苹果的Touch Icon. Touch Icon 当我们想让一个网页比较完美地添加到桌面,通常情况下我们需要设置一个png图片文