Android实现双击事件的两种方式

Work around的方法是先监听onTouch事件来监听连续点击次数,每次点击都布置一个间隔时间的延时任务,延时任务执行时判断间隔内是否还有点击,如果没有则发布点击次数,重置计数。

实现代码如下:

/**
 * 连续点击事件监听器 可以用作双击事件
 *
 */
public abstract class OnMultiTouchListener implements OnTouchListener {
    /**
     * 上次 onTouch 发生的时间
     */
    private long lastTouchTime = 0;
    /**
     * 已经连续 touch 的次数
     */
    private AtomicInteger touchCount = new AtomicInteger(0);

    private Runnable mRun = null;

    public void removeCallback() {
        if (mRun != null) {
       getMainLoopHandler().removeCallbacks(mRun);
            mRun = null;
        }
    }

    @Override
    public boolean onTouch(final View v, final MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            final long now = System.currentTimeMillis();
            lastTouchTime = now;

            touchCount.incrementAndGet();
       //每点击一次就移除上一次的延迟任务,重新布置一个延迟任务
            removeCallback();

            mRun = new Runnable() {
                @Override
                public void run() {            //两个变量相等,表示时隔 multiTouchInterval之后没有新的touch产生, 触发事件并重置touchCount
                    if (now == lastTouchTime) {
                        onMultiTouch(v, event, touchCount.get());
                        touchCount.set(0);
                    }
                }
            };

            postTaskInUIThread(mRun, getMultiTouchInterval());
        }
        return true;
    }

    /**
     * 连续touch的最大间隔, 超过该间隔将视为一次新的touch开始, 默认是400,推荐值,也可以由客户代码指定
     *
     * @return
     */
    protected int getMultiTouchInterval() {
        return 400;
    }

    /**
     * 连续点击事件回调
     *
     * @param v
     * @param event
     * @param touchCount
     *            连续点击的次数
     * @return
     */
    public abstract void onMultiTouch(View v, MotionEvent event, int touchCount);
}

使用代码:

mView.setOnTouchListener( new OnMultiTouchListener() {
        @Override
        public void onMultiTouch(View v, MotionEvent event, int touchCount) {
            if (touchCount == 2) {
              //双击
            }
        }
    });

简洁直接的方法是用GestureDector类:

mView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                GestureDetector detector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {

                    @Override
                    public boolean onSingleTapUp(MotionEvent e) {
                        return super.onSingleTapUp(e);
                    }

                    @Override
                    public void onLongPress(MotionEvent e) {
                        super.onLongPress(e);
                    }

                    @Override
                    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                        return super.onScroll(e1, e2, distanceX, distanceY);
                    }

                    @Override
                    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                        return super.onFling(e1, e2, velocityX, velocityY);
                    }

                    @Override
                    public void onShowPress(MotionEvent e) {
                        super.onShowPress(e);
                    }

                    @Override
                    public boolean onDown(MotionEvent e) {
                        return super.onDown(e);
                    }

                    @Override
                    public boolean onDoubleTap(MotionEvent e) {
                        return super.onDoubleTap(e);
                    }

                    @Override
                    public boolean onDoubleTapEvent(MotionEvent e) {
                        return super.onDoubleTapEvent(e);
                    }

                    @Override
                    public boolean onSingleTapConfirmed(MotionEvent e) {
                        return super.onSingleTapConfirmed(e);
                    }

                    @Override
                    public boolean onContextClick(MotionEvent e) {
                        return super.onContextClick(e);
                    }
                });
                detector.onTouchEvent(event);

                return false;
            }
        });
时间: 2024-12-21 00:41:38

Android实现双击事件的两种方式的相关文章

Android模拟点击的两种方式

导论 在Android中模拟一个点击事件有两种方式是通过模拟MotionEvent来实现:一种是通过ADB来实现 第一种:模拟MotionEvent 通用方法如下: private void setSimulateClick(View view, float x, float y) { long downTime = SystemClock.uptimeMillis(); final MotionEvent downEvent = MotionEvent.obtain(downTime, dow

Android开发中单元测试的两种方式

Android开发中单元测试的两种方式 一位优秀的程序员也同样不能保证自己的程序没有bug,因此编写合适的测试程序是完全有必要的,这样也会降低程序在后期出现各种奇奇怪怪bug的可能,降低维护成本,未雨绸缪将bug扼杀在摇篮之中. 看到网上有很多依旧用写java单元测试的方式在写android程序的单元测试程序--junit,当然我一直都反感将不合时宜的东西强搬到新的技术应用以获取一席之地的这种做法,不断的应用新的方法提高效率,完善程序才是真理!废话不多说,直接说到今天的重点:Android开发中

Android实现音频录制的两种方式

在移动APP开发中,每逢APP应用设计到多媒体开发的时候,都会让很多的程序员头疼不已,而且项目的开发进度会放慢.项目 的难度也会加大蛮多,同时APP的测试也会增加.Android中的多媒体开发,有音频的播放.音频的录制.视频的播放.视频的录制 等,虽然Android的SDK中提供了一些基础的开发API类,如音频的录制就提供了两种方式:AudioRecord录制音频和MediaRecorder录 制音频.AudioRecord类相对于MediaRecorder来说,更加接近底层,为我们封装的方法也

android点击事件的四种方式

第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; imp

Android: Android Studio签名打包的两种方式(zz)

注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如果不知道签名是啥意思,请自行百度哦.在eclipse中签名的方法是:选中工程,邮件选择"export-android-export android application", 1.方式1:通过Android Studio进行签名: 选中app这个module,选择菜单栏"Build-Generate

(原创)android中使用相机的两种方式

在社交类应用或扫描二维码的场合都需要用到手机上的摄像头 在程序中启用这一硬件主要有两类方法 1.发送intent启动系统自带的摄像应用 此应用的AndroidManifest中的intent-filter如下 <intent-filter> <action android:name="android.media.action.VIDEO_CAPTURE" /> <category android:name="android.intent.cate

转:在android中button响应的两种方式

1. 在布局文件中添加button的监听名字 Android:onClick="buttonOnClick" 例如: <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/button1&q

Android中activity传值的两种方式

第一种:第一个Activity  /**      * 通过这个方法跳转到activity2界面*/     public void gotoActivity2(View v){      //创建一个意图      Intent intent=new Intent(this,MainActivity2.class);                //第一种传值方式      Bundle bundle=new Bundle();      bundle.putString("name&quo

Android 监听短信 两种方式

1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: <uses-permission android:name="android.permission.SEND_SMS"></uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS"