换个思路实现控件的multi click

说到控件的多击,大家肯定能想到通过判断前后点击时的时间值来处理双击、三击事件。
这里简述一下大家常用的三种方式,以双击为例:
1 .通过new Thread来清空上次的点击时间

public void click(View view) {
        if (firstClickTime > 0) {
            secondClickTime = SystemClock.uptimeMillis();
            if (secondClickTime - firstClickTime < 500) {
                //再这处理双击操作
                  dosomethig();
            }
            firstClickTime = 0;
            return ;
        }
        firstClickTime = SystemClock.uptimeMillis();
        
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                //
                try {
                    Thread.sleep(500);
                    firstClickTime = 0;
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
        }).start();
    }

2.通过list的add,remove,clear来完成双击判断

List times = new ArrayList();
    public void click(View view) {
        times.add(SystemClock.uptimeMillis());
        if (times.size() == 2) {
            //已经完成了一次双击,list可以清空了
            if (times.get(times.size()-1)-times.get(0) < 500) {
                times.clear();
                //再这处理双击操作
                dosomething();
            } else {
                //这种情况下,第一次点击的时间已经没有用处了,第二次就是“第一次”
                times.remove(0);
            }
        }
    }

3.第三种,谷歌使用的数组移位方式

long[] mHits = new long[2];
    public void click() {
        /**
         * arraycopy,拷贝数组 
         * src 要拷贝的源数组
         * srcPos 源数组开始拷贝的下标位置
         * dst 目标数组
         * dstPos 开始存放的下标位置
         * length 要拷贝的长度(元素的个数)
         *
         */
        //实现数组的移位操作,点击一次,左移一位,末尾补上当前开机时间(cpu的时间)
        System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
        mHits[mHits.length - 1] = SystemClock.uptimeMillis();
        //双击事件的时间间隔500ms
        if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
            //双击后具体的操作
            dosomething();
        }
    }

新思路

但是上面的这三种方式,都只能单独处理双击的情况,当我们单击时不能执行相应操作(最近需要实现一个多击屏幕的客制化需求。。。分别要响应单、双、三击)。我的想法是只在Click方法里,判断点击间隔时间,赋值当前的count,然后通过Handler在runnable中处理相应count值的操作。

    @OnClick(R.id.mButton)
    public void onClick() {
        if (clickCount==0) {
            long currentClick = SystemClock.uptimeMillis();
            if (currentClick - lastClick < 600){
                return ;//
            }
            mHandler.postDelayed(mRunnable,600);
        }
        clickCount++;
    }

在runnable中为lastClick赋值,同时清空count,当间隔小于600毫秒时,直接return,不继续post。代码如下:

        mHandler=new Handler();
        mRunnable= new Runnable() {
            public void run() {
                //mHandler.removeCallbacks(mRunnable);
                if (clickCount ==1){
                    Toast.makeText(MainActivity.this,"单击哦~",Toast.LENGTH_SHORT).show();
                }else if (clickCount ==2){
                    Toast.makeText(MainActivity.this,"双击哦~",Toast.LENGTH_SHORT).show();
                }else if (clickCount ==3 ){
                    Toast.makeText(MainActivity.this,"三击哦~",Toast.LENGTH_SHORT).show();
                }
                lastClick=SystemClock.uptimeMillis();
                clickCount = 0;
            }
        };

有其他见解的欢迎补充~

你可能感兴趣的:(换个思路实现控件的multi click)