14

指、または最終的にはスタイラスを使用して画面に書き込むアプリを作成しています。私はその部分を機能させています。ACTION_DOWN で、描画を開始します。ACTION_MOVE では、線分を追加します。ACTION_UP で、行を終了します。

問題は、ACTION_DOWN の後、ACTION_MOVE イベントの送信を開始するために、ポインターが開始位置から 10 ピクセル以上 (基本的には開始点の周囲の 20x20 ボックス) 離れて移動する必要があるようです。ボックスを離れた後、移動イベントはすべて非常に正確です。(私はそれをテストして 10 ピクセルのことを理解しました。) これは書き込みや描画に使用することを意図しているため、10 ピクセルはかなり大きな損失です: どれだけ小さく書こうとしているかによっては、最初の文字を失う可能性があります。または2つ。私はそれについて何も見つけることができませんでした-http://android.modaco.com/topic/339694-touch-input-problem-not-detecting-very-smallのように、フォーラムに2、3の投稿しかありません-movements/page_ pid _1701028#entry1701028. 一部のデバイスまたはシステムには存在するようですが、他には存在しないようです。ただし、それを持っているときにそれを取り除く方法についてのアイデアはありません。

Android 3.1 で Galaxy Tab 10.1 を使用しています。私はそれを取り除くためにいくつかの異なることを試みました.イベントの座標を別のものに設定して、カーソルが別の場所にあると思わせることができるかどうかを確認しました. 座標を変更してイベントを再ディスパッチしようとしました (ハンドラーは新しいポイントに反応しましたが、半径 10 ピクセルの動きにはまだ反応しませんでした)。効果への参照をソース コードで検索しました。何も見つかりませんでした(ただし、Androidの別のバージョンのものだと思います-3.1のコードはまだリリースされていませんか?)ポインターの現在の状態を照会する方法を検索したので、タイマーを使用できましたポインターがしきい値を超えるまで変更をキャッチします。できなかった 対応する移動イベントなしでポインター座標を取得する方法を見つけられません。何も機能しませんでした。誰かがこれについて何か知っているか、アイデアや回避策を持っていますか? ありがとうございました。

-- 更新: ドラッグ アンド ドロップ イベントは同じしきい値を示します。

4

3 に答える 3

25

@passsyによる投稿に部分的に同意しますが、別の結論に達します。最初に述べたように、これmTouchSlopは私たちが興味を持っており、ViewConfiguration.get(context).getScaledTouchSlop();

ViewConfiguratonのAndroidソースを確認すると、TOUCH_SLOPのデフォルト値は8dipですが、コメントにはこの値はフォールバックのみであり、実際の値はその特定のデバイスのAndroidOSがビルドされたときに定義されると記載されています。(この値より多い場合も少ない場合もあります。GalaxyTabデバイスにも当てはまるようです)

コードサンプルに固有の値は、が初期化されたときにmTouchSlopから読み取られますが、値はメソッドでのみアクセスされます。このメソッドを(を呼び出さずに)拡張してオーバーライドすると、クラス内のの動作は関係なくなります。ViewConfigurationViewonTouchEventViewsupermTouchSlopView

画面にタッチイベントをオーバーレイするようにAndroid設定を変更すると、Android OSの十字線が移動しないという事実によって強調されるように、小さなドラッグでのタッチはモーションイベントとして登録されません。このことから、OSレベルで最小のドラッグ距離が適用されており、アプリケーションはTOUCH_SLOP値よりも小さいドラッグイベントを認識しないという結論に達しました。また、TOUCH_SLOPを直接使用しないでください。また、APIはgetTouchSlopメソッドを非推奨にし、推奨します。getScaledTouchSlopこれは、デバイスの画面サイズとピクセル密度を考慮に入れています。これの副作用は、さまざまなデバイスで認識される実際の最小ストローク長が異なる場合があることです。たとえば、Galaxy Tab 2.0 7.0 "では、Galaxy Tab 2.0 10.1"で実行する場合よりも、同じコードベースを使用して短い最小ストロークを描画できるように感じます。

また、(この値を変更する方法を見つけた場合)この値によって、Androidシステムがタップとストロークを区別する方法が決まることにも注意してください。つまり、画面をタップしたが、タップの実行中に指がわずかに動いた場合、TOUCH_SLOPよりも小さく移動した場合はタップとして解釈され、TOUCH_SLOPよりも大きく移動した場合はストロークとして解釈されます。したがって、 TOUCH_SLOPを小さい値に設定すると、タップがストロークとして解釈される可能性が高くなります。

私たち自身の結論は、この最小距離は実際に変更できるものではなく、私たちが一緒に暮らす必要があるものであるということです。

于 2013-03-14T05:14:18.577 に答える
4

問題は、クラス ビューhttps://github.com/android/platform_frameworks_base/blob/master/core/java/android/view/View.javaの 6549 行にあります。

if (!pointInView(x, y, mTouchSlop)) {...}

 /**
 * Utility method to determine whether the given point, in local coordinates,
 * is inside the view, where the area of the view is expanded by the slop factor.
 * This method is called while processing touch-move events to determine if the event
 * is still within the view.
 */
private boolean pointInView(float localX, float localY, float slop) {
    return localX >= -slop && localY >= -slop && localX < ((mRight - mLeft) + slop) &&
            localY < ((mBottom - mTop) + slop);
}

mTouchSlop はコンストラクターで設定されます

mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();

View を拡張し、mTouchSlop をゼロに設定できます。mTouchSlop を設定する他の方法はありません。のような機能はありませんgetApplicationContext.setScaledTouchSlop(int n)

于 2012-01-13T14:43:46.827 に答える