?一币他、實(shí)現(xiàn)方式
?1抽兆、Rxjava
?2、自定義類繼承OnClickListener接口
二酪穿、實(shí)現(xiàn)過程
1凳干、Rxjava
這種方式需要項(xiàng)目以來rxjava庫,推薦在項(xiàng)目中存在該庫時(shí)使用**
如果不想依賴被济,可以參考第二種方式救赐。
用到的方法:Observable的throttleFirst方法實(shí)現(xiàn)短時(shí)間內(nèi)的事件過濾。
import android.view.View
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import java.util.concurrent.TimeUnit
/**
* View控件短時(shí)間內(nèi)二次點(diǎn)擊的幫助類
*/
class DebounceHelper {
? ? companion object{
? ? ? ? /**
? ? ? ? * 對(duì)View的點(diǎn)擊事件在設(shè)定的時(shí)間內(nèi)進(jìn)行防止二次點(diǎn)擊只磷,不帶View參數(shù)的回調(diào)
? ? ? ? * @param view
? ? ? ? * @param debounceTime 設(shè)定的這個(gè)時(shí)間內(nèi)经磅,View點(diǎn)擊只有一次起效,時(shí)間單位是秒
? ? ? ? * @param runnable? View的點(diǎn)擊后的執(zhí)行方法的回調(diào)
? ? ? ? */
? ? ? ? fun click(view: View,debounceTime:Long,runnable: Runnable){
? ? ? ? ? ? Observable.create<View> {
? ? ? ? ? ? ? ? var emitter = it
? ? ? ? ? ? ? ? view?.setOnClickListener {
? ? ? ? ? ? ? ? ? ? Log.e("DebounceHelper","點(diǎn)擊...")
? ? ? ? ? ? ? ? ? ? emitter.onNext(it)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }.throttleFirst(debounceTime,TimeUnit.SECONDS)
? ? ? ? ? ? ? ? ? ? .observeOn(AndroidSchedulers.mainThread())
? ? ? ? ? ? ? ? ? ? .subscribe { runnable.run() }
? ? ? ? }
? ? ? ? /**
? ? ? ? * 對(duì)View的點(diǎn)擊事件在設(shè)定的時(shí)間內(nèi)進(jìn)行防止二次點(diǎn)擊喳瓣,帶View參數(shù)的回調(diào)
? ? ? ? * @param view
? ? ? ? * @param debounceTime 設(shè)定的這個(gè)時(shí)間內(nèi)馋贤,View點(diǎn)擊只有一次起效,時(shí)間單位是秒
? ? ? ? * @param listener? View的點(diǎn)擊事件回調(diào)畏陕,帶有本身View的參數(shù)
? ? ? ? */
? ? ? ? fun click(view: View,debounceTime:Long,listener:View.OnClickListener){
? ? ? ? ? ? Observable.create<View> {
? ? ? ? ? ? ? ? var emitter = it
? ? ? ? ? ? ? ? view?.setOnClickListener {
? ? ? ? ? ? ? ? ? ? emitter.onNext(it)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }.throttleFirst(debounceTime,TimeUnit.SECONDS)
? ? ? ? ? ? ? ? ? ? .observeOn(AndroidSchedulers.mainThread())
? ? ? ? ? ? ? ? ? ? .subscribe { listener.onClick(it) }
? ? ? ? }
? ? }
}
調(diào)用:
DebounceHelper.click(mView,1, Runnable {
? ? ? ? ? ? //執(zhí)行方法
? ? ? ? ? ? timeCount++
? ? ? ? ? ? LoggerUtil.e("clickTextView:$timeCount")
? ? ? ? ? ? Toast.makeText(this.context,"clickTextView:$timeCount",Toast.LENGTH_SHORT).show()
? ? ? ? })
當(dāng)logcat顯示:點(diǎn)擊... 配乓,表示點(diǎn)擊了按鈕,
顯示:clickTextView的時(shí)候惠毁,表示執(zhí)行了點(diǎn)擊事件犹芹。
可以根據(jù)logcat顯示情況,當(dāng)View重復(fù)點(diǎn)擊的時(shí)候鞠绰,在1秒內(nèi)都是不會(huì)去執(zhí)行點(diǎn)擊事件的腰埂,雖然已經(jīng)發(fā)生了點(diǎn)擊。
下面的第二種方式也是相同的操作蜈膨。
?2屿笼、自定義類繼承OnClickListener接口
這種方式無需依賴第三方庫,推薦在項(xiàng)目中沒有rxjava庫時(shí)使用
import android.view.View
/**
* View點(diǎn)擊事件短時(shí)間內(nèi)連續(xù)點(diǎn)擊的過濾類翁巍,避免在重復(fù)操作
* @param debounceTime 兩次點(diǎn)擊的最短間隔時(shí)間驴一,在此時(shí)間內(nèi)的點(diǎn)擊只執(zhí)行一次,單位是毫秒灶壶,如限制1秒肝断,傳入:1000
* @param runnable 點(diǎn)擊事件的方法都在該Runnable類中執(zhí)行。如需返回view作為參數(shù),可將該類替換成 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) return
? ? ? ? if (mLastClickTime > 0) {
? ? ? ? ? ? val currentTimeMillis = System.currentTimeMillis()
? ? ? ? ? ? val debounceBetweenTime = currentTimeMillis - mLastClickTime
? ? ? ? ? ? //時(shí)間大于指定的時(shí)間胸懈,執(zhí)行runnable的回調(diào)
? ? ? ? ? ? if (debounceBetweenTime > debounceTime) {
? ? ? ? ? ? ? ? mLastClickTime = System.currentTimeMillis()
? ? ? ? ? ? ? ? runnable.run()
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? LoggerUtil.e("時(shí)間間隔:$debounceBetweenTime")
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? mLastClickTime = System.currentTimeMillis()
? ? ? ? ? ? runnable.run()
? ? ? ? }
? ? }
}
調(diào)用:
mView.apply {
? ? setOnClickListener(DebounceClickListener(1000, Runnable {
? ? ? ? //執(zhí)行方法
? ? ? ? timeCount++
? ? ? ? LoggerUtil.e("clickTextView:$timeCount")
? ? ? ? Toast.makeText(this.context,"clickTextView:$timeCount",Toast.LENGTH_SHORT).show()
? ? }))
}