Android-View點(diǎn)擊事件短時(shí)間重復(fù)點(diǎn)擊的過濾


?一币他、實(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()

? ? }))

}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末担扑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趣钱,更是在濱河造成了極大的恐慌涌献,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羔挡,死亡現(xiàn)場離奇詭異洁奈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绞灼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門利术,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人低矮,你說我怎么就攤上這事印叁。” “怎么了军掂?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵轮蜕,是天一觀的道長。 經(jīng)常有香客問我蝗锥,道長跃洛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任终议,我火速辦了婚禮汇竭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘穴张。我一直安慰自己细燎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布皂甘。 她就那樣靜靜地躺著玻驻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偿枕。 梳的紋絲不亂的頭發(fā)上璧瞬,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音渐夸,去河邊找鬼嗤锉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捺萌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼桃纯,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼酷誓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起态坦,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤盐数,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后伞梯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玫氢,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年谜诫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漾峡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喻旷,死狀恐怖生逸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情且预,我是刑警寧澤槽袄,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站锋谐,受9級(jí)特大地震影響遍尺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涮拗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一乾戏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧多搀,春花似錦歧蕉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至从藤,卻和暖如春催跪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夷野。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國打工懊蒸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悯搔。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓骑丸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子通危,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容