3

パッドに何かを描くことができる非常に単純な Android アプリケーションを作成します。画面に指で触れると緑色のボールが表示され、指を動かすと赤い線が表示されます。

しかし、私は非常に奇妙なことを発見しました: 画面を 2 本の指で 1 本ずつ非常に速くタッチすると、2 本の指の間に線が引かれます! (キーボードの 2 つのキーを押しているイメージjkjkjkjkjkjjkjkjkjkjkjkj)

キー コードは非常に単純です。

public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    switch (action & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            multiTouch = false;

            id = event.getPointerId(0);
            PointF p = getPoint(event, 0);
            path = new Path();
            path.moveTo(p.x, p.y);
            paths.add(path);

            points.add(copy(p));
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            multiTouch = true;
            for (int i = 0; i < event.getPointerCount(); i++) {
                int tId = event.getPointerId(i);
                if (tId != id) {
                    points.add(getPoint(event, i));
                }
            }
            break;
        case MotionEvent.ACTION_MOVE:
            if (!multiTouch) {
                p = getPoint(event, 0);
                path.lineTo(p.x, p.y);
            }
            break;
    }

    invalidate();

    return true;
}

完全なソースはこちら: https://github.com/freewind/TouchTest/blob/master/src/com/example/MyImageView.java

そして、それは動作するデモです: https://github.com/freewind/TouchTest

または、署名済みの apk を Android デバイスにダウンロードして、自分でテストすることもできます: https://github.com/freewind/TouchTest/blob/master/TouchTest.apk?raw=true

私のコードでわかるように、マルチタッチであるかどうかを確認し、その場合の描画を無効にしました。

Android のバージョンは 4.0 で、コード ターゲットは 2.3.3 です。

私のアンドロイドパッドに写真があります:

ここに画像の説明を入力

いくつかの線があることがわかりますが、赤い線の左側に緑のボールがあるはずです。

Android が速いシングル タッチを移動として扱う理由がわかりません。3 つの理由を考えました。

  1. 私のコードには何か問題があります
  2. Android SDK に問題があります
  3. ACTION_DOWN イベントがないなど、Android パッドに問題があります。

本当の理由を知るには?


アップデート

私の友人の 1 人は彼の android モバイル (android 2.1) を使用してこのアプリをテストし、赤い線がないことを発見し、別の人は android 2.3.5 を使用し、赤い線があることを発見しました。

コードを確認してください。マルチタッチをチェックしました。複数のポイントがある場合ACTION_POINTER_DOWNは何もしません。ACTION_MOVEしたがって、idof ポイントは必要ありません。(実際、このコードの最初のバージョンで使用idしましたが、同じ問題があります)。

そして、これは予期された動作ではないと思います。なぜなら、これは、感動的なプログラムの開発を難しくしたからです。私の別のアプリケーション(ユーザーは指で画像をドラッグ/ズーム/回転できる)で、画像が画面上で「ジャンプ」することがあるため、この問題が見つかりました。

Android パッドと iTouch で人気のゲーム (Fruit Ninja) を試してみたところ、Android バージョンには問題がありましたが、iTouch には問題がありませんでした。

今、何か問題があると確信しています (最初の指が上がったときにイベントが欠落しているACTION_UP) が、何が原因なのかまだわかりません。私のアンドロイドパッド?またはAndroid SDK?

4

2 に答える 2

0

touch の id を確認できるため、最初のタッチのみを単独で処理できます。

または、すべてのタッチを監視してまとめて処理することもできます。

于 2012-09-01T18:42:27.217 に答える
0

それがマルチタッチで機能する方法です。高速アンドロイドを押すと、それをジェスチャーとして処理すると、2 つのポインターが押されます。これを回避するには、action_up を処理するか、代わりに action_pointer_down を使用してください

于 2012-09-01T16:00:30.917 に答える