一、实现方式

1、Rxjava

2、自定义类继承OnClickListener接口

二、实现过程

1、Rxjava

这种方式需要项目以来rxjava库,推荐在项目中存在该库时使用

如果不想依赖,可以参考第二种方式。
用到的方法:Observable的throttleFirst方法实现短时间内的事件过滤。
复制代码
import android.view.View
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import java.util.concurrent.TimeUnit/*** View控件短时间内二次点击的帮助类*/
class DebounceHelper {companion object{/*** 对View的点击事件在设定的时间内进行防止二次点击,不带View参数的回调* @param view* @param debounceTime 设定的这个时间内,View点击只有一次起效,时间单位是秒* @param runnable  View的点击后的执行方法的回调*/fun click(view: View,debounceTime:Long,runnable: Runnable){Observable.create<View> {var emitter = itview?.setOnClickListener {Log.e("DebounceHelper","点击...")emitter.onNext(it)}}.throttleFirst(debounceTime,TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe { runnable.run() }}/*** 对View的点击事件在设定的时间内进行防止二次点击,带View参数的回调* @param view* @param debounceTime 设定的这个时间内,View点击只有一次起效,时间单位是秒* @param listener  View的点击事件回调,带有本身View的参数*/fun click(view: View,debounceTime:Long,listener:View.OnClickListener){Observable.create<View> {var emitter = itview?.setOnClickListener {emitter.onNext(it)}}.throttleFirst(debounceTime,TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe { listener.onClick(it) }}}
}
复制代码

调用:

DebounceHelper.click(mView,1, Runnable {//执行方法timeCount++LoggerUtil.e("clickTextView:$timeCount")Toast.makeText(this.context,"clickTextView:$timeCount",Toast.LENGTH_SHORT).show()})
复制代码

当logcat显示:点击... ,表示点击了按钮,

显示:clickTextView的时候,表示执行了点击事件。

可以根据logcat显示情况,当View重复点击的时候,在1秒内都是不会去执行点击事件的,虽然已经发生了点击。

下面的第二种方式也是相同的操作。

2、自定义类继承OnClickListener接口

这种方式无需依赖第三方库,推荐在项目中没有rxjava库时使用

import android.view.View/*** View点击事件短时间内连续点击的过滤类,避免在重复操作* @param debounceTime 两次点击的最短间隔时间,在此时间内的点击只执行一次,单位是毫秒,如限制1秒,传入:1000* @param runnable 点击事件的方法都在该Runnable类中执行。如需返回view作为参数,可将该类替换成 View.OnClickListener */
class DebounceClickListener(var debounceTime: Long, var runnable: Runnable) : View.OnClickListener {var mLastClickTime: Long = System.currentTimeMillis()override fun onClick(view: View?) {if (view == null) returnif (mLastClickTime > 0) {val currentTimeMillis = System.currentTimeMillis()val debounceBetweenTime = currentTimeMillis - mLastClickTime//时间大于指定的时间,执行runnable的回调if (debounceBetweenTime > debounceTime) {mLastClickTime = System.currentTimeMillis()runnable.run()} else {LoggerUtil.e("时间间隔:$debounceBetweenTime")return}} else {mLastClickTime = System.currentTimeMillis()runnable.run()}}}
复制代码

调用:

mView.apply {setOnClickListener(DebounceClickListener(1000, Runnable {//执行方法timeCount++LoggerUtil.e("clickTextView:$timeCount")Toast.makeText(this.context,"clickTextView:$timeCount",Toast.LENGTH_SHORT).show()}))
}
复制代码

Android-View点击事件短时间重复点击的过滤相关推荐

  1. html 避免重复点击,js点击事件防止用户重复点击执行

    js jquery 选择器总结 js jquery 选择器总结 一.原始JS选择器. id选择器:document.getElementById("test"); name选择器: ...

  2. vue、uniapp 小程序点击事件禁止多次点击方法封装

    vue.uniapp 小程序点击事件禁止多次点击方法封装 在写uniapp 小程序时发现个bug,疯狂点击按钮第一点击事件还没执行完就疯狂多次调用该事件,很是影响用户体验以及消耗性能,所以这里我封装个 ...

  3. 微信小程序只允许触发一次点击事件(防止多次点击事件)

    微信小程序只允许触发一次点击事件(防止多次点击事件) 超级简单 容易理解 可以让绑定的事件只触发一次 //.wxml <button bindtap="click1"> ...

  4. UE4 鼠标点击事件 || 虚幻4 鼠标点击事件

    UE4  鼠标点击事件||虚幻4  鼠标点击事件 一 .预备工作 1. 打开关卡蓝图 2.在关卡蓝图中进行下列操作 二.静态网格物体的点击事件 1. 将静态网格物体拖拽到场景中,右击 进行如图操作 选 ...

  5. android多击事件_Android中的多击事件

    在android系统中.google提供了一个click事件.只负责相应单次点击. 如果想实现双机或者多击事件的话就需要借鉴下google原生应用的源码了. 在android中,三次点击android ...

  6. js 点击事件穿透 html,Js点击事件.html

    Js点击事件 /*Reset css*/ body{font-family:"宋体";font-size:12px;background:#fff;color:#333;margi ...

  7. php鼠标点击事件,javascript模拟鼠标点击事件的实例代码

    javascript触发模拟鼠标点击事件 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等)有dispatchEvent方法. 一般 ...

  8. 添加li标签点击事件,删除当前点击li标签

    1.创建一个 HTML 文件 2.在html中写ul标签,给ul标签设置id,在ul标签里面写三个li标签,在li标签里面写任意文本内容 3.在html中写一个button按钮给按钮设置一个id,设置 ...

  9. js触发点击事件(模拟自动点击事件)

    进入页面触发点击事件 js 派发事件 Event.initEvent()已弃用 添加链接描述 if(document.all) {// IE浏览器document.getElementById(&qu ...

最新文章

  1. android okhttp 多线程,android – Okhttp Authenticator多线程
  2. Scala print语句格式打印
  3. 【SSM整合案例】静态资源和分页标签的添加
  4. wxWidgets:窗口删除
  5. 好家伙,MacOS 新版本终于删掉自带 Python2,连 Python 死忠粉都叫好!
  6. 【HDU - 5456】Matches Puzzle Game(数位dp,思维)
  7. Moodl:集成密码,消除错误phpCAS error: phpCAS::client(): type mismatched for parameter $se
  8. POJ 1991 Turning in Homework ★(区间DP)
  9. 小博老师精选Java十大CMS ——建站神器
  10. 经典排序算法(六)--归并排序Merge Sort
  11. MS OFFICE 2019下载及使用
  12. JAVA常量池,一篇文章就足够入门了。(含图解)
  13. 《OpenGL编程指南第7版》3视图
  14. react项目里添加支持less(无webpack.config.js如何设置
  15. Torus:为Kubernetes量身打造的分布式存储方案
  16. Android 六大布局
  17. 工程力学专业考研转计算机,“初见不知提桶意,再见已是提桶人”,土木跨考计算机可行吗?...
  18. 第六章 DDL语言
  19. 《脑机接口导论》学习笔记 3.记录大脑的信号和刺激大脑
  20. 解决Ubuntu Linux终端输入命令没有颜色提示的设置方法

热门文章

  1. [国嵌攻略][085][共享内存通讯]
  2. Linux入门基础分享[一]
  3. Jquery plugin template POPUP Plugin
  4. 【Java中级】(三)IO
  5. 趣味SQL:用SQL计算瓷砖费用
  6. 使用CSS3线性渐变实现图片闪光划过效果
  7. 魔兽世界---屠夫(Just a Hook)
  8. hibernate基础之无法自动创建表总结
  9. HTML5 Canvas 自定义笔刷
  10. stm32f4xx 的EXTI使用的一般步骤