肯定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可能具有相似的內在的東西。但是呢?有人知道嗎?我不熟悉平臺的任何來源,並希望不要在那裏挖掘,所以我會很感激,如果有人分享經驗。
也許是的,謝謝!在接受你的答案之前,我需要檢查它。 –
確定這個GestureDetector絕對做我需要的。我仍然需要找到如何在我的活動中正確使用它,但是我的原始問題已得到解答。感謝您的幫助。 –
很高興有幫助。 'GestureDetector'不是微不足道的,但有一些體面的例子在線。 – 323go