2

私のアプリケーションは、端から端までのボタンのグリッドです。すべてのタッチ イベントとモーション イベントをオーバーライドし、動作を手動で制御しています。指が画面外にドラッグされた場合を除いて、すべて正常に機能しています。MotionEvent.ACTION_UP がトリガーされますが、それは望ましくありません。getRawX() と getRawY() を使用して (たとえば、上端と左端の場合) 座標が < 1 であるかどうかを判断しようとしましたが、指をすばやくドラッグすると値が高くなります (20 まで)。ACTION_UP がトリガーされると、場所の値が少し遅れているように見えます。これを回避する方法はありますか?ACTION_CANCEL はまったくトリガーされないようです。

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case (MotionEvent.ACTION_DOWN):
        Log.i(classID, "action down");
        return true;
    case (MotionEvent.ACTION_CANCEL):
        Log.i(classID, "action cancel");
        // never called
        return true;
    case (MotionEvent.ACTION_MOVE):
        Log.i(classID, "action move");
        return true;
    case (MotionEvent.ACTION_UP):
        Log.i(classID, "action up");
        Log.i(classID, "position: " + (int)event.getRawX() + "/" + (int)event.getRawY());
        return true;
    }
    return false;
}
4

2 に答える 2

2

この 2 つに物理的または論理的な違いはありません (指が画面から落ちた場合と指を離した場合)。指が画面から離れたときは、指を「離した」、より正確に言えば、画面から指を離したことになります。MotionEvent.ACTION_UP は、タッチ入力データがシステムに提供されないモーション イベントのプレース ホルダーです。

これを回避したい場合は、親ビューと子ビューを作成できます。タッチが子ビューから「持ち上げられ」たが親ビューに残っている場合、指はまだデバイス上にありますが、範囲外です。

于 2012-10-10T00:38:51.640 に答える
0

画面から指を離すこととビューの境界から指をスワイプすることの間に「物理的な違いはない」という彼の発言は正しくありません。

画面の中央にSurfaceViewを配置し、 OnTouchイベント コールバックで次のようなIFステートメントを使用するだけで、そのことを証明できます。

if (event.getEvent() == MotionEvent.ACTION_UP) {
         Log.d("derp", "finger has lifted up");
}

指が単に境界から出た場合は、実際には報告されないことがわかります。MotionEvent.ACTION_OUTSIDEがありますが、動作していないようです。したがって、なぜ私もここを見ているのですか。

于 2012-10-29T22:35:01.337 に答える