簡體   English   中英

Android如何處理點擊?

[英]How does Android handle clicks?

無疑,Android具有確定用戶含義的可靠方法:單擊或滾動/移動。 是否有任何簡單的規則足以建立相同的行為?

這是我的問題。

我有一個控件,應該單擊它並運行自己的單擊處理程序,或者滾動(點按並移動)並使整個視圖滾動(我有一個在兩個方向上都滾動的自定義視圖,如果有必要, 這里就是一個想法 )。 因此,我設置了一個簡單的觸摸偵聽器,該偵聽器可以記住onEvent上onTouch上的點,並在MotionEvent.ACTION_UP上調用單擊處理程序(如果該點未更改)。

這在模擬器中效果很好,因為鼠標單擊非常精確,因此我沒有注意到任何危險,並且在三星Galaxy S Plus上也沒有遇到任何問題-也許我在點擊屏幕時確實很准確。

但是,我的第一個Beta測試人員抱怨按鈕不起作用-不是100%而是大多數時間,因此他們需要多次單擊按鈕,直到它可以處理單擊為止。 他們中的一些人還告訴我,如果用手指的指尖觸摸屏幕,則按鈕的效果會稍好一些。

經過一番思考,我假設它們在單擊時可能會稍微移動手指,因此DOWN和UP上的點有所不同,並且處理程序無法確定單擊。 為了驗證這一點,我添加了一個簡單的改進,允許進行較小的漂移,這很有幫助! 測試人員證實,這種技巧使事情變得更好。 這是處理程序的最終代碼:

// This interface is for a real click handler that may differ depending on control.
interface Clicker {
    boolean click(View v);
}

class ButtonTouchListener implements OnTouchListener {
    private boolean _trackingButtonClick = false;
    private Clicker _clicker;
    // These two integers are the improvement.
    private int downX = 0;
    private int downY = 0;

    public ButtonTouchListener(Clicker clicker) {
        _clicker = clicker;
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX = (int) event.getRawX();
                downY = (int) event.getRawY();
                trackingButtonClick = true;
                // Calling the onTouchEvent of the main view that handles the global scrolling.
                return onTouchEvent(event);
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_OUTSIDE:
                int newX = (int) event.getRawX();
                int newY = (int) event.getRawY();
                int xOffset = downX - newX;
                int yOffset = downY - newY;
                // These two lines are the improvement also.
                // 10 is a max move distance that I've simply guessed.
                if (Math.abs(xOffset) >= 10 || Math.abs(yOffset) >= 10)
                    _trackingButtonClick = false;
                // Calling the onTouchEvent of the main view that handles the global scrolling.
                return onTouchEvent(event);
            case MotionEvent.ACTION_UP:
                if (_trackingButtonClick) {
                    _trackingButtonClick = false;
                    // Calling the click handler of the control.
                    return _clicker.click((View)v.getTag());
                }
                _trackingButtonClick = false;
                return true;
            default :
                return onTouchEvent(event);
            }
        }
    }
}

因此,看來我做出了正確的猜測,而Android內部可能也有類似的東西。 但是嗎? 有人知道嗎 我對平台的任何來源都不熟悉,希望不要在該平台上挖掘,所以如果有人分享經驗,我將不勝感激。

您在尋找GestureDetector嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM