2

Android のACTION_MOVE一連の s からデルタを正確に読み取ろうとしていました。MotionEvent

ACTION_DOWNただし、画面上で指をスワイプした私のテストでは、最初の の後、いくつかMotionEventの がリスナーに配信されないことが示唆されています。十分に大きな移動が行われた後にのみACTION_MOVE、比較的大きなデルタでイベントが配信されます。この最初のACTION_MOVEイベントの後、すべてのデルタは再び非常に小さくなります。

または、画面 ( ) に触れてACTION_DOWN少し動き回っても、ACTION_MOVEイベントはまったく配信されません。

多くの用途において、特定の動き (鈍感) を持つことが有益であることを理解しています。ACTION_MOVEただし、最初の小さな動きがすべて配信されるように、イベントの合体を回避する方法はありますか? ACTION_DOWN位置と最初の位置の間の最小距離に設定できるしきい値はありACTION_MOVEますか?

サンプルコードは次のとおりです。

private float lastX;
private float lastY;

public boolean onTouch(View v, MotionEvent ev) {

    final float y = ev.getX();
    final float x = ev.getY();

    final int hs = ev.getHistorySize();

    final int ac = ev.getAction();
    switch(ac)
    {
        case MotionEvent.ACTION_DOWN:
        {
            this.lastX = x;
            this.lastY = y;
            Log.i("TEST", "Down at " + x + "/" + y + " (History size="+hs+")");
            return true;
        }
        case MotionEvent.ACTION_MOVE:
        {
            Log.i("TEST", "Move at " + x + "/" + y + ": Delta="+(lastX-x)+"/"+(lastY-y) + " (History size="+hs+")");
            this.lastX = x;
            this.lastY = y;
            return true;
        }
        case MotionEvent.ACTION_UP:
        {
            Log.i("TEST", "Up at " + x + "/" + y + " (History size="+hs+")");
            return true;
        }
    } 
}

対応する出力:

Down at 376.0/259.0 (History size=0)
Move at 392.0/268.0: Delta=-16.0/-9.0 (History size=0)
Move at 394.0/268.0: Delta=-2.0/0.0 (History size=0)
Move at 395.0/269.0: Delta=-1.0/-1.0 (History size=0)
Move at 394.0/268.0: Delta=1.0/1.0 (History size=0)
Move at 396.0/269.0: Delta=-2.0/-1.0 (History size=0)
Move at 399.0/271.0: Delta=-3.0/-2.0 (History size=1)
Move at 401.0/272.0: Delta=-2.0/-1.0 (History size=0)
Move at 403.0/273.0: Delta=-2.0/-1.0 (History size=0)
Move at 404.0/273.0: Delta=-1.0/0.0 (History size=0)
Move at 405.0/274.0: Delta=-1.0/-1.0 (History size=0)
Move at 406.0/275.0: Delta=-1.0/-1.0 (History size=0)
Up at 406.0/275.0 (History size=0)

つまり、2 行目の大きなデルタ (-16/-9) は避けたいのですが、1 か 2 の順序でデルタを受け取りたいのです...

Samsung Galaxy S2 と Note でテストを行いました。

どんな助けや提案も大歓迎です!

4

2 に答える 2

4

断りたくないのですが、これは完全に Samsung の責任であり、Galaxy S2 でのみ発生します。基本的に、彼らは本当の理由もなく、入力ドライバにソフトウェア タッチしきい値を追加しました。

私はかつて彼らにしきい値を削除するよう説得しようとしましたが、彼らは問題を理解していないようで、それは故意であると私に言いました! それにもかかわらず、彼らはGalaxy S3でそれを修正しました.

幸いなことに、これはハードウェアの制限ではないため、ルート化された電話を使用するか、カスタム ROM をインストールすれば回避できます。

于 2012-10-16T10:30:16.077 に答える
1

一部のアプリで MotionEvent を使用していますが、この問題に直面したことはありません。

SDK バージョン > 4 を使用している場合、MotionEvent はマルチタッチをサポートします。私は自分のアプリでこれをテストしており、変更されたリスナーを使用してタッチイベントを取得しています。以下のコード:

private static PointF touchScreenStartPtArr[] = new PointF[10]; 
private static PointF touchScreenStopPtArr[] = new PointF[10]; 
private static PointF touchScreenCurrPtArr[] = new PointF[10]; 

OnTouchListener onTouchListenerMulti = new OnTouchListener() { 

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

        int action = event.getAction() & MotionEvent.ACTION_MASK; 
        int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
        int fingerId = event.getPointerId(pointerIndex); 

        switch (action) { 
        case MotionEvent.ACTION_DOWN: 
        case MotionEvent.ACTION_POINTER_DOWN: 
            touchScreenStartPtArr[fingerId].x = event.getX(pointerIndex); 
            touchScreenStartPtArr[fingerId].y = event.getY(pointerIndex); 
            break; 
        case MotionEvent.ACTION_UP: 
        case MotionEvent.ACTION_POINTER_UP: 
        case MotionEvent.ACTION_CANCEL: 
            touchScreenStopPtArr[fingerId].x = event.getX(pointerIndex); 
            touchScreenStopPtArr[fingerId].y  = event.getX(pointerIndex); 
            break; 
        case MotionEvent.ACTION_MOVE: 
            int pointerCount = event.getPointerCount(); 
            for (int i = 0; i < pointerCount; i++) { 
                touchScreenCurrPtArr[fingerId].x = event.getX(i); 
                touchScreenCurrPtArr[fingerId].y = event.getY(i); 
            } 
            break; 
        } 
        return true; 
    } 
}; 

- 編集 -

デバイス Huawei X5 でコードを実行した結果:

Down at 387.29388/247.27272 (History size=0)
Move at 387.29388/247.27272: Delta=0.0/0.0 (History size=0)
Move at 387.29388/247.27272: Delta=0.0/0.0 (History size=0)
Move at 387.29388/245.39589: Delta=0.0/1.876831 (History size=0)
Move at 387.29388/244.92668: Delta=0.0/0.46920776 (History size=0)
Move at 387.29388/244.45747: Delta=0.0/0.46920776 (History size=0)
Move at 387.29388/243.98827: Delta=0.0/0.46920776 (History size=0)
Move at 387.29388/243.51906: Delta=0.0/0.46920776 (History size=0)
Move at 389.01614/243.51906: Delta=-1.7222595/0.0 (History size=0)
Move at 389.8773/243.51906: Delta=-0.861145/0.0 (History size=0)
Move at 389.8773/243.04985: Delta=0.0/0.46920776 (History size=0)
Move at 390.73843/243.04985: Delta=-0.861145/0.0 (History size=0)
Move at 390.73843/242.58064: Delta=0.0/0.46920776 (History size=0)
Move at 391.59958/242.58064: Delta=-0.861145/0.0 (History size=0)
Move at 391.59958/242.11143: Delta=0.0/0.46920776 (History size=0)
Move at 392.46072/242.11143: Delta=-0.861145/0.0 (History size=0)
Move at 392.46072/241.64223: Delta=0.0/0.46920776 (History size=0)
Move at 393.32187/241.64223: Delta=-0.861145/0.0 (History size=0)
Move at 394.183/241.64223: Delta=-0.861145/0.0 (History size=0)
Move at 394.183/241.17302: Delta=0.0/0.46920776 (History size=0)
Move at 395.04413/241.17302: Delta=-0.8611145/0.0 (History size=0)
Move at 395.04413/242.11143: Delta=0.0/-0.9384155 (History size=0)
Move at 395.04413/242.58064: Delta=0.0/-0.46920776 (History size=0)
Up at 395.04413/242.58064 (History size=0)

このリスナーからイベントを盗む別のリスナーがあるようです。

確認のために、クリーニングプロジェクトでコードをチェックすることをお勧めします(最後に「return false」を追加する必要があります)。

幸運を。

于 2012-10-06T15:05:06.707 に答える