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

1.思路和效果

思路:
首先需要判别用户是单击还是双击:
单击:用户点击一次后,一段时间内不再点击
双击:用户点击一次后,立刻再次点击一次,两次点击时间短
所以需要延时,去判断在一段时间内用户点击了几次
首先,考虑到使用线程记录时间,但是开启线程会消耗资源,
所以使用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方法中的代码
  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在 Android监听 View双击事件,可以使用 GestureDetector 来实现。以下是一个示例: 1. 创建一个 GestureDetector 对象并实现 OnGestureListener 接口: ```java GestureDetector gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDoubleTap(MotionEvent e) { // 在双击事件发生时执行相应的操作 return true; } }); ``` 在上述代码中,`context` 是当前上下文对象。我们创建了一个 GestureDetector 对象,并实现了 OnGestureListener 接口中的 onDoubleTap() 方法,该方法中可以执行双击事件发生时需要执行的操作。 2. 将触摸事件传递给 GestureDetector: ```java view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } }); ``` 在上述代码中,我们将触摸事件传递给 GestureDetector 的 onTouchEvent() 方法。这样,GestureDetector 将负责处理触摸事件,并在双击事件发生时调用 onDoubleTap() 方法。 3. 在需要监听双击事件的 View 上设置上述触摸监听器: ```java View view = findViewById(R.id.your_view_id); view.setOnTouchListener(onTouchListener); ``` 在上述代码中,`R.id.your_view_id` 是要监听双击事件的 View 的 ID,您需要将其替换为实际的 View ID。 通过以上步骤,您可以在 Android监听 View双击事件,并在双击发生时执行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值