9

私のアプリには、ユーザーが画面上で移動する必要がある要素があります。これを行うには、RelativeLayout と onTouchListener を使用しています。

私が抱えている問題は、私の内部で、とonTouchListenerの奇妙な結果が得られることです。getX()getY()

次のコード行をonTouch()->ACTION_MOVEブロックに追加しました。

Log.v("example", "Touch: {x:" + event.getX() + " } {y:" + event.getY() + "}");

以下は私の LogCat の結果です。

04-29 03:16:11.000: V/myApp(24188): タッチダウン!
04-29 03:16:11.057: V/myApp(24188): タッチ: {x:69.78699} {y:107.774216}
04-29 03:16:11.103: V/myApp(24188): タッチ: {x:77.86926 {y:173.37648}
04-29 03:16:11.158: V/myApp(24188): タッチ: {x:69.78699} {y:108.781845}
04-29 03:16:11.205: V/myApp(24188):タッチ: {x:77.86926} {y:174.38597}
04-29 03:16:11.463: V/myApp(24188): タッチ: {x:69.78699} {y:109.64778}
04-29 03:16:11.502: V /myApp(24188): タッチ: {x:77.86926} {y:175.62172}
04-29 03:16:11.596: V/myApp(24188): タッチ: {x:69.23099} {y:109.40666}
04-29 03 :16:11.654: V/myApp(24188): タッチアップ!

ご覧のとおり、指を直線上で非常にゆっくりと動かすと、正しい座標が実際には 1 本おきの線になっている、びくびくした結果が得られます。

これにより、画面上でドラッグすると、ビューが目的の位置とオフセット位置の間で前後にジャンプします。

単一の要素のみを作成していること、およびこのリスナーがこの単一のビュー以外から呼び出されていないことを確認するためにチェックを追加しました。

他の誰かがこの問題を以前に見たことがあり、それを修正するために何ができるかについて何か洞察がありますか?

編集

View.OnTouchListener onTouch = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.d("example", "Touch down");
            break;

        case MotionEvent.ACTION_UP:
            Log.d("example", "Touch up");
            break;

        case MotionEvent.ACTION_MOVE:
            Log.v("example", "Touch: {x:" + event.getX() + " } {y:" + event.getY() + "}");
        }

        return true;    
    }
};
4

3 に答える 3

8

event.getRawX()、およびを使用して、この問題を解決できましたevent.getRawY()

于 2013-04-29T17:06:07.933 に答える
3

ACTION_MOVE イベントを処理した後、onTouch() 内で true を返しますか? さらに、Android の公式リファレンスで説明されているように、「効​​率のために、モーション イベントは単一のオブジェクト内で複数の動きのサンプルをまとめることができます」。したがって、getX() と getY() は最後の座標を取得する場合にのみ使用してください。以前の座標にアクセスするには、メソッド getHistoricalX(int) および getHistoricalY(int) を使用できます。詳細については、公式リファレンスを参照してください。

于 2013-04-29T08:59:04.703 に答える