這種方式須要項目以來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
這種方式無需依賴第三方庫,推薦在項目中沒有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()
}))
}
複製代碼