2012-12-23 152 views
0

肯定Android有一些可靠的方式來確定用戶的含義:點擊或滾動/移動。是否有任何簡單的規則足以構建相同的行爲?Android如何處理點擊?

這是我的問題。我有一個控制,應該被點擊並運行自己的點擊處理程序,或滾動(點擊和移動),並使整個視圖滾動(我有一個自定義視圖,雙向滾動,here is the idea如果重要) 。所以我設置了一個簡單的觸摸偵聽器,它記住MotionEvent.ACTION_DOWN中onTouch的點,並在點沒有改變時調用MotionEvent.ACTION_UP上的點擊處理程序。

在模擬器中工作正常,因爲鼠標點擊是精確的,所以我沒有注意到任何危險,我沒有遇到任何問題,我的三星Galaxy S Plus - 也許我真的準確時,點擊屏幕。

但是,我的第一個測試版測試人員抱怨說,按鈕不起作用 - 不是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可能具有相似的內在的東西。但是呢?有人知道嗎?我不熟悉平臺的任何來源,並希望不要在那裏挖掘,所以我會很感激,如果有人分享經驗。

回答

0

您是否在尋找GestureDetector

+0

也許是的,謝謝!在接受你的答案之前,我需要檢查它。 –

+0

確定這個GestureDetector絕對做我需要的。我仍然需要找到如何在我的活動中正確使用它,但是我的原始問題已得到解答。感謝您的幫助。 –

+0

很高興有幫助。 'GestureDetector'不是微不足道的,但有一些體面的例子在線。 – 323go