Android-View点击事件短时间重复点击的过滤
一、实现方式
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点击事件短时间重复点击的过滤相关推荐
- html 避免重复点击,js点击事件防止用户重复点击执行
js jquery 选择器总结 js jquery 选择器总结 一.原始JS选择器. id选择器:document.getElementById("test"); name选择器: ...
- vue、uniapp 小程序点击事件禁止多次点击方法封装
vue.uniapp 小程序点击事件禁止多次点击方法封装 在写uniapp 小程序时发现个bug,疯狂点击按钮第一点击事件还没执行完就疯狂多次调用该事件,很是影响用户体验以及消耗性能,所以这里我封装个 ...
- 微信小程序只允许触发一次点击事件(防止多次点击事件)
微信小程序只允许触发一次点击事件(防止多次点击事件) 超级简单 容易理解 可以让绑定的事件只触发一次 //.wxml <button bindtap="click1"> ...
- UE4 鼠标点击事件 || 虚幻4 鼠标点击事件
UE4 鼠标点击事件||虚幻4 鼠标点击事件 一 .预备工作 1. 打开关卡蓝图 2.在关卡蓝图中进行下列操作 二.静态网格物体的点击事件 1. 将静态网格物体拖拽到场景中,右击 进行如图操作 选 ...
- android多击事件_Android中的多击事件
在android系统中.google提供了一个click事件.只负责相应单次点击. 如果想实现双机或者多击事件的话就需要借鉴下google原生应用的源码了. 在android中,三次点击android ...
- js 点击事件穿透 html,Js点击事件.html
Js点击事件 /*Reset css*/ body{font-family:"宋体";font-size:12px;background:#fff;color:#333;margi ...
- php鼠标点击事件,javascript模拟鼠标点击事件的实例代码
javascript触发模拟鼠标点击事件 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等)有dispatchEvent方法. 一般 ...
- 添加li标签点击事件,删除当前点击li标签
1.创建一个 HTML 文件 2.在html中写ul标签,给ul标签设置id,在ul标签里面写三个li标签,在li标签里面写任意文本内容 3.在html中写一个button按钮给按钮设置一个id,设置 ...
- js触发点击事件(模拟自动点击事件)
进入页面触发点击事件 js 派发事件 Event.initEvent()已弃用 添加链接描述 if(document.all) {// IE浏览器document.getElementById(&qu ...
最新文章
- android okhttp 多线程,android – Okhttp Authenticator多线程
- Scala print语句格式打印
- 【SSM整合案例】静态资源和分页标签的添加
- wxWidgets:窗口删除
- 好家伙,MacOS 新版本终于删掉自带 Python2,连 Python 死忠粉都叫好!
- 【HDU - 5456】Matches Puzzle Game(数位dp,思维)
- Moodl:集成密码,消除错误phpCAS error: phpCAS::client(): type mismatched for parameter $se
- POJ 1991 Turning in Homework ★(区间DP)
- 小博老师精选Java十大CMS ——建站神器
- 经典排序算法(六)--归并排序Merge Sort
- MS OFFICE 2019下载及使用
- JAVA常量池,一篇文章就足够入门了。(含图解)
- 《OpenGL编程指南第7版》3视图
- react项目里添加支持less(无webpack.config.js如何设置
- Torus:为Kubernetes量身打造的分布式存储方案
- Android 六大布局
- 工程力学专业考研转计算机,“初见不知提桶意,再见已是提桶人”,土木跨考计算机可行吗?...
- 第六章 DDL语言
- 《脑机接口导论》学习笔记 3.记录大脑的信号和刺激大脑
- 解决Ubuntu Linux终端输入命令没有颜色提示的设置方法