view

Android 同时实现View的单击和双击监听

2019-10-31  本文已影响0人  残非
单击和双击.gif

思路:

首先需要判别用户是单击还是双击:
单击:用户点击一次后,一段时间内不再点击
双击:用户点击一次后,立刻再次点击一次,两次点击时间短
所以需要延时,去判断在一段时间内用户点击了几次
首先,考虑到使用线程记录时间,但是开启线程会消耗资源,
所以使用Handler来完成延时的记录,但是Handler可能会造成内存泄露,
所以每次使用过后就都将Handler清理一次,同时也是为了清理掉这一次的延时记录。

2.代码实现

实现接口View.OnTouchListener,并重写onTouch()方法

import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
/**
 * Created by HeTingwei on 2018/4/30.
 */

public class MyClickListener implements View.OnTouchListener {

private static int timeout=400;//双击间四百毫秒延时
private int clickCount = 0;//记录连续点击次数
private Handler handler;
private MyClickCallBack myClickCallBack;
public interface MyClickCallBack{
    void oneClick();//点击一次的回调
    void doubleClick();//连续点击两次的回调

}


public MyClickListener(MyClickCallBack myClickCallBack) {
    this.myClickCallBack = myClickCallBack;
    handler = new Handler();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        clickCount++;
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (clickCount == 1) {
                    myClickCallBack.oneClick();
                }else if(clickCount==2){
                    myClickCallBack.doubleClick();
                }
                handler.removeCallbacksAndMessages(null);
                //清空handler延时,并防内存泄漏
                clickCount = 0;//计数清零
            }
        },timeout);//延时timeout后执行run方法中的代码
    }
    return false;//让点击事件继续传播,方便再给View添加其他事件监听
}
}

3.使用举例

两个用法例子:
使用例子1:使用匿名类(以下为实现添加单双击监听的代码片段)

View button= findViewById(R.id.button);
view.setOnTouchListener(new MyClickListener
 (new MyClickListener.MyClickCallBack() {

        @Override
        public void oneClick() {
            Toast.makeText(MainActivity.this, "单击", 
            Toast.LENGTH_SHORT).show();
        }

        @Override
        public void doubleClick() {
            Toast.makeText(MainActivity.this, "双击", 
            Toast.LENGTH_SHORT).show();
        }
    }));

使用例子2:Activity实现单双击接口(以下为实现添加单双击监听的完整代码)

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity implements
 MyClickListener.MyClickCallBack{


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    View button = findViewById(R.id.button);
    button.setOnTouchListener(new MyClickListener(this));
}


@Override
public void oneClick() {
    Toast.makeText(this, "单击", Toast.LENGTH_SHORT).show();
}

@Override
public void doubleClick() {
    Toast.makeText(this, "双击", Toast.LENGTH_SHORT).show();
}
}

4.扩展(三击及其以上监听)

聪明的同学应该可以自己按我的代码依样画葫芦,自己就能将三击实现,但是这里还是写一下。
三击监听的话在MyClickListener 如下位置添加对应代码即可,同时使用的地方同样添加对应方法即可。同理四击,需要注意的是时延理当延长了。当然三击四击一般都用不到,所以就简略的写一下了。

...
 public interface MyClickCallBack{
    void oneClick();//点击一次的回调
    void doubleClick();//连续点击两次及其以上的回调
    void threeClick();//连续点击三次及其以上的回调
}
...
  @Override
            public void run() {
                if (clickCount == 1) {
                    myClickCallBack.oneClick();
                }else if(clickCount==2){
                    myClickCallBack.doubleClick();
                }else if(clickCount==3){
                myClickCallBack.threeClick()
                }
                handler.removeCallbacksAndMessages(null);
                //清空handler延时,并防内存泄漏
                clickCount = 0;//计数清零
            }
        },timeout);//延时timeout后执行run方法中的代码

本文装载自:CSDN
原文链接:https://blog.csdn.net/htwhtw123/article/details/80150984

上一篇下一篇

猜你喜欢

热点阅读