1.概況:
? 在app 使用中經(jīng)常遇到界面中按鈕 點(diǎn)擊時(shí) 連續(xù)點(diǎn)擊兩次或者多次,導(dǎo)致按鈕下邏輯功能重復(fù)執(zhí)行,造成資源浪費(fèi)甚至程序出錯(cuò),為了盡量避免這種情況出現(xiàn),提出防抖動(dòng)方法。
2.實(shí)現(xiàn)思路
<1.? 主要思路為 通過(guò)兩次點(diǎn)擊的時(shí)間差,來(lái)對(duì)比是否在最短時(shí)間內(nèi),來(lái)判斷點(diǎn)擊是否有效。
<2. 不同view 通過(guò)對(duì)比當(dāng)前點(diǎn)擊View 的id 判斷是否是同一個(gè)view,如果是同一個(gè)view 進(jìn)行防抖動(dòng)校驗(yàn),如果不是同一個(gè)view,重置當(dāng)前校驗(yàn)。
3.代碼實(shí)現(xiàn)
public class NoDoubleClickUtil {
? ? public static int mId = -1;
? ? private static long mFirstClickTime;//記錄首次點(diǎn)擊時(shí)間
? ? public static boolean checkDoubleClick(int id) {
? ? ? ? long clickTime = System.currentTimeMillis();//記錄當(dāng)前點(diǎn)擊時(shí)間
? ? ? ? if (mId == -1 || mId != id) {//不同view,重置
? ? ? ? ? ? mId = id;
? ? ? ? ? ? mFirstClickTime = clickTime;
? ? ? ? ? ? return true;
}
? ? ? ? if (clickTime - mFirstClickTime > Constant.NO_DOUBLE_CLICK_TIME) {
? ? ? ? //判斷當(dāng)前時(shí)間差是否大于校驗(yàn)時(shí)長(zhǎng),如果大于 判斷為此次不是無(wú)效點(diǎn)擊
? ? ? ? ? ? mFirstClickTime = clickTime;
? ? ? ? ? ? return true;
? ? ? ? } else {
? ? ? ? ? ? return false;
}
}
}
4.代碼中使用
@OnClick({R.id.tv_text1, R.id.tv_text2})
public void onViewClicked(View view) {
? ? if (!NoDoubleClickUtil.checkDoubleClick(view.getId())) {//判斷如果是錯(cuò)誤點(diǎn)擊,直接返回,不執(zhí)行操作
? ? ? ? return;
}
? ? switch (view.getId()) {
? ? ? ? case R.id.tv_text1:
? ? ? ? ? ? ToastUtils.showShortToast(MyApplication.mContext, "點(diǎn)擊1:" + System.nanoTime());
? ? ? ? ? ? break;
? ? ? ? case R.id.tv_text2:
? ? ? ? ? ? ToastUtils.showShortToast(MyApplication.mContext, "點(diǎn)擊2:" + System.nanoTime());
? ? ? ? ? ? break;
}
}