間違いなくAndroidには、ユーザーが何を意味しているかを判断するための信頼できる方法がいくつかあります。クリックまたはスクロール/移動です。同じ動作を構築するのに十分な簡単なルールはありますか?
これが私の問題です。
クリックして独自のクリックハンドラーを実行するか、スクロール(タップして移動)してビュー全体をスクロールする必要があるコントロールがあります(両方向にスクロールするカスタムビューがあります。これが重要な場合のアイデアです)。そこで、MotionEvent.ACTION_DOWNのonTouchのポイントを記憶し、ポイントが変更されていない場合はMotionEvent.ACTION_UPのクリックハンドラーを呼び出す単純なタッチリスナーを設定しました。
マウスのクリックが正確であるため、エミュレータでは問題なく機能しました。危険に気づかず、Samsung 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にはおそらく似たようなものがあります。しかし、それはありますか?誰か知っていますか?私はプラットフォームのソースに精通しておらず、そこで掘り下げたくないので、誰かが経験を共有してくれれば幸いです。