Android-View點擊事件短期重複點擊的過濾

1、實現方式

一、Rxjava

二、自定義類繼承OnClickListener接口

2、實現過程

一、Rxjava

這種方式須要項目以來rxjava庫,推薦在項目中存在該庫時使用java

若是不想依賴,能夠參考第二種方式。
用到的方法: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 = it
                view?.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 = it
                view?.setOnClickListener {
                    emitter.onNext(it)
                }
            }.throttleFirst(debounceTime,TimeUnit.SECONDS)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe { listener.onClick(it) }
        }
    }
}
複製代碼

調用:react

DebounceHelper.click(mView,1, Runnable {
            //執行方法
            timeCount++
            LoggerUtil.e("clickTextView:$timeCount")
            Toast.makeText(this.context,"clickTextView:$timeCount",Toast.LENGTH_SHORT).show()
        })
複製代碼

當logcat顯示:點擊... ,表示點擊了按鈕,android

顯示:clickTextView的時候,表示執行了點擊事件。bash

能夠根據logcat顯示狀況,當View重複點擊的時候,在1秒內都是不會去執行點擊事件的,雖然已經發生了點擊。app

下面的第二種方式也是相同的操做。ide

二、自定義類繼承OnClickListener接口

這種方式無需依賴第三方庫,推薦在項目中沒有rxjava庫時使用ui

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) return
        if (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()
        }

    }

}
複製代碼

調用:this

mView.apply {
    setOnClickListener(DebounceClickListener(1000, Runnable {
        //執行方法
        timeCount++
        LoggerUtil.e("clickTextView:$timeCount")
        Toast.makeText(this.context,"clickTextView:$timeCount",Toast.LENGTH_SHORT).show()
    }))
}
複製代碼

相關文章
相關標籤/搜索