Android 记录控件连续点击次数

本文详细解释了单击与连击的区别,并提供了一个实现代码示例,包括如何定义连击的有效范围、判断点击事件间隔、记录连击次数以及处理点击结束后的事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    对于单击和连击 ,最基本的区别就是“单击是每次点击的时间间隔超过连击的有效范围,而连击是每次点击的时间间隔都在连击的有效范围内”(PS:个人观点,有不妥的欢迎指正)

    所以要想判断是否是连击,就得定义一个连击的有效范围 interval(一个长整型变量)

private long interval = 500;


    在每次点击的时候判断与上一次点击的时间间隔是否符合 interval(即时间间隔小于或等于interval),不符合的,可能是连击的开始,也可能仅仅是单击,所以我们的连击计数器 count (一个整型变量)的值是 1,如果符合的话,就累加 count

@Override
	public void onClick(View v) {
		long secondTime = System.currentTimeMillis();
		// 判断每次点击的事件间隔是否符合连击的有效范围
		// 不符合时,有可能是连击的开始,否则就仅仅是单击
		if (secondTime - firstTime <= interval) {
			++count;
		} else {
			count = 1;
		}
		// 延迟,用于判断用户的点击操作是否结束
		delay();
		firstTime = secondTime;
	}


为了判断用户是否点击完毕,每次点击后,都会重置一个延时时钟,当用户结束点击事件后,该延时时钟就会如愿的运行起来,

// 延迟时间是连击的时间间隔有效范围
	private void delay() {
		if (task != null)
			task.cancel();

		task = new TimerTask() {
			@Override
			public void run() {
				Message message = new Message();
				// message.what = 0;
				handler.sendMessage(message);
			}
		};
		delayTimer = new Timer();
		delayTimer.schedule(task, interval);
	}


并调用我们定义的点击事件处理函数。

// 点击事件结束后的事件处理
		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				if (count == 1) {
					tvCount.setText("单击事件");
				} else if (count > 1) {
					tvCount.setText("连续点击事件,共点击了 " + count + " 次");
				}
				delayTimer.cancel();
				count = 0;
				super.handleMessage(msg);
			}
		};

因为在这里讲的是一个记录连击次数的,所以就只显示是单击还是连击及连击次数。


完整的类代码<MainActivity.java>如下:

package com.example.multiclick;

import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;

public class MainActivity extends Activity implements OnClickListener {
	private Button btClick = null;
	private TextView tvCount = null;
	private int count = 0;
	private long firstTime = 0;
	private Timer delayTimer;
	private Handler handler;
	private TimerTask task;
	private long interval = 500;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		btClick = (Button) findViewById(R.id.btClick);
		btClick.setOnClickListener(this);
		tvCount = (TextView) findViewById(R.id.tvCount);

		// 点击事件结束后的事件处理
		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				if (count == 1) {
					tvCount.setText("单击事件");
				} else if (count > 1) {
					tvCount.setText("连续点击事件,共点击了 " + count + " 次");
				}
				delayTimer.cancel();
				count = 0;
				super.handleMessage(msg);
			}
		};
	}

	@Override
	public void onClick(View v) {
		long secondTime = System.currentTimeMillis();
		// 判断每次点击的事件间隔是否符合连击的有效范围
		// 不符合时,有可能是连击的开始,否则就仅仅是单击
		if (secondTime - firstTime <= interval) {
			++count;
		} else {
			count = 1;
		}
		// 延迟,用于判断用户的点击操作是否结束
		delay();
		firstTime = secondTime;
	}

	// 延迟时间是连击的时间间隔有效范围
	private void delay() {
		if (task != null)
			task.cancel();

		task = new TimerTask() {
			@Override
			public void run() {
				Message message = new Message();
				// message.what = 0;
				handler.sendMessage(message);
			}
		};
		delayTimer = new Timer();
		delayTimer.schedule(task, interval);
	}

}

布局文件<activity_main.xml>如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btClick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvCount"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="62dp"
        android:text="点击" />

    <TextView
        android:id="@+id/tvCount"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="34dp"
        android:text="@string/hello_world" />

</RelativeLayout>

结果图如下:



本文是本人的学习笔记,如有什么不足之处,欢迎指出,谢谢!


转载于:https://my.oschina.net/DecaLon/blog/131130

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值