3

アプリの目的:

画面上で認識されたすべてのタッチに対して円を描画し、タッチ イベントを追跡するシンプルなアプリ。「高圧読み取り」ではgetPressure (int pointerIndex)、円の色が変わり、半径が大きくなります。getPointerId (int pointerIndex)さらに、x 座標と y 座標、および圧力を含むタッチ ID が、指のタッチの横に表示されます。

重要な部分のコード スニペットをたどってください (これが最も適切なコードではないことをご容赦ください ;) 私は知っています)

protected void onDraw(Canvas canvas){

    //draw circle only when finger(s) is on screen and moves 
    if(iTouchAction == (MotionEvent.ACTION_MOVE)){
        int x,y;
        float pressure;

        //Draw circle for every touch
        for (int i = 0; i < touchEvent.getPointerCount(); i++){
            x = (int)touchEvent.getX(i);
            y = (int)touchEvent.getY(i);
            pressure = touchEvent.getPressure(i);

            //High pressure
            if (pressure > 0.25){
                canvas.drawCircle(x, y, z+30, pressureColor);
                canvas.drawText(""+touchEvent.getPointerId(i)+"  | "+x+"/"+y, x+90, y-80, touchColor);
                canvas.drawText(""+pressure, x+90, y-55, pressureColor);
            }else{ //normal touch event 
                canvas.drawCircle(x, y, z, touchColor);
                canvas.drawText(""+touchEvent.getPointerId(i)+" | "+x+"/"+y, x+60, y-50, touchColor);
                canvas.drawText(""+pressure, x+60, y-25, pressureColor);
            }
        }           
    }
}

問題:

Android 2.1 を実行する HTC Desire がテスト プラットフォームです。アプリは正常に動作し、問題なく 2 本の指を追跡します。しかし、2 つの接触点が近づきすぎると、互いに干渉するように見えます。共有の x 軸と y 軸に「スナップ」して円を描いているように見えます。場合によっては、他のタッチ イベントの入力座標を交換することさえあります。もう 1 つの問題はgetPressure (int pointerIndex)、PointerID を参照しているにもかかわらず、両方のタッチ イベントが同じ圧力測定値を持つことです。

これはすべて少し抽象的なので、ここでビデオを見つけてください: http://www.youtube.com/watch?v=bFxjFexrclU

私の質問:

  1. 私のコードは単に間違っていますか?
  2. Android 2.1 はタッチ イベントを十分に処理できず、混乱するのでしょうか?
  3. これはハードウェアの問題であり、1) および 2) とは関係ありませんか?

回答および/または他のスレッドへの再リンクをありがとうございます (この問題に対処するスレッドを見つけて申し訳ありません)。

クリス

4

2 に答える 2

3

言いたくないのですが、それはあなたのハードウェアです。

Nexus One で使用されているタッチパネル (HTC Desire で使用されているのと同じハードウェアであると私は信じています) は、この特定のアーティファクトで知られています。Android 2.2 の ACTION_POINTER_UP/DOWN イベントに関する「他の指の軸へのジャンプ」問題を軽減するために、いくつかの検出可能な悪いイベントを削除する作業を行いましたが、ポインタが 1 つの軸に沿って近づくと問題は解決しません。このパネルは、X 座標データと Y 座標データをランダムに反転させることでも知られています。2 点 (x0, y0) と (x1, y1) は (x0, y1) と (x1, y0) になります。悲しいことに、Android 自体がデータを取得するまでに「実際の」データがなくなった場合にできることは限られています。

これは、危険なマルチタッチ機能を備えた野生の唯一のパネルではありません. このような問題が発生せずに正確なマルチタッチ データ レポートを実行できる画面があるかどうかを実行時に確認するには、PackageManager を使用してFEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT. この機能を利用できない場合でも、スケール ジェスチャなどの簡単なことを確実に行うことができます。

于 2010-09-24T17:53:37.323 に答える
1

以前、古い Androidでマルチタッチ ジェスチャに対してこの修正を試みた人はいますか? Android 1.x/2.x のバギー マルチタッチにも対応しているため、自分のプロジェクトで評価する予定です。

Luke は、ここで説明した問題だけでなく、3.x より前のデバイスでのその他の一般的なタッチ入力の問題についても説明しているようです。

それが役に立てば幸いです、乾杯。

于 2012-06-27T18:37:36.017 に答える