Android針對快速點擊事件的處理

概述

當對一個按鈕快速點擊的時候,往往很可能會多次觸發同一個邏輯,在有些場景下,會顯得極度不合理。而且,這種情況在性能較低的手機上觸發概率更高。
比如,點擊一個按鈕打開登錄頁面,如果用戶點擊過快的話,完全可能會跳出兩個登錄頁面。

個人總結了一下針對這種情況的幾種處理方式,如有問題或者其他更好的方式可以評論交流。

處理方式

第一次點擊後,讓點擊事件失效

這種情況更適合於一些耗時的操作,比如網絡操作等。
需要注意的是,一般情況下,在操作結束後,需要把點擊事件設置爲生效。

		final Button btn=new Button(this);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btn.setClickable(false);
            }
        });

使用參數攔截點擊事件

一般是設置一個boolean值來判斷時候已經點擊過,或者時候正在操作中,如果是的話,那麼再次點擊只會直接return。

    private boolean hasSetFlag=false;
    private int flag;

    public void setFlag(int flag) {
        if(hasSetFlag){
            this.flag=flag;
        }
    }

設置點擊間隔

如果兩次點擊在點擊時間間隔內,就不生效。
需要注意的是,FastClickManager儘量都直接寫到點擊事件的方法中,而不要寫到其他邏輯裏。否則如果其他邏輯觸發了FastClick的邏輯,有可能會導致點擊事件失效。

public class FastClickManager {
    private static final int DEFAULT_FAST_CLICK_INTERVAL = 500;
    private static long lastClickTime = 0L;

    public FastClickManager() {
    }

    public static boolean isFastDoubleClick() {
        return isFastDoubleClick(DEFAULT_FAST_CLICK_INTERVAL);
    }

    public static boolean isFastDoubleClick(long intervalMillis) {
        long now = SystemClock.elapsedRealtime();
        if (Math.abs(now - lastClickTime) < intervalMillis) {
            return true;
        } else {
            lastClickTime = now;
            return false;
        }
    }
}

		final Button btn=new Button(this);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(FastClickManager.isFastDoubleClick()){
                    return;
                }
            }
        });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章