8

GestureOverlayView で純粋な水平ジェスチャと垂直ジェスチャの両方を検出したいと考えています。

http://android-developers.blogspot.com/2009/10/gestures-on-android-16.htmlから

"orientation: 下のビューのスクロール方向を示します。この場合、リストは垂直方向にスクロールします。つまり、水平方向のジェスチャ (action_delete など) はすぐにジェスチャとして認識されます。垂直方向のストロークで始まるジェスチャには、少なくとも 1 つのジェスチャが含まれている必要があります。つまり、単純な垂直線は、リストのスクロールと競合するため、ジェスチャとして認識できません。」

Android:orientation が垂直に設定されている場合、キャッチ 22 のように思えます。横方向のスワイプしかできず、Android:orientation が水平方向に設定されている場合は、縦方向のスワイプしかできません。この要件を回避するにはどうすればよいですか?

4

4 に答える 4

7

私はハッカソンでこの問題に遭遇しました。GestureOverlayViewで解決する方法はないため、モーションイベントを使用する必要があります。ただし、GestureOverlayViewは、円のような少し「詳細な」ジェスチャで機能します。私が気付いたのは、GestureOverlayViewが閉じた図形に最適であるということです。つまり、motionEventセンサーです。ここでコードを見つけました。垂直スワイプについてもGavの回答を変更しました。まだテストしていませんが、動作するはずです。

次に例を示します。

public class SelectFilterActivity extends Activity implements OnClickListener
{

private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /* ... */

    // Gesture detection
    gestureDetector = new GestureDetector(new MyGestureDetector());
    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            return gestureDetector.onTouchEvent(event);
        }
    };

}

class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {
            // downward swipe
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)
                Toast.makeText(SelectFilterActivity.this, "Downward Swipe", Toast.LENGTH_SHORT).show();
 else if (Math.abs(e2.getY() - e1.getY()) > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)
                Toast.makeText(SelectFilterActivity.this, "Upward Swipe", Toast.LENGTH_SHORT).show();
            // right to left swipe
            else if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
            }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
            }
        } catch (Exception e) {
            // nothing
        }
        return false;
    }

}

次に、ジェスチャ検出が必要なビューに追加します。

// Do this for each view added to the grid
    imageView.setOnClickListener(SelectFilterActivity.this); 
    imageView.setOnTouchListener(gestureListener);

コードをGavに乾杯!

于 2013-01-13T10:01:21.117 に答える
5

GestureStrokeAngleThreshold を 90 に近い値に設定するだけです (私は 90f を使用しました)。

角度のしきい値のデフォルト値は 40.0f です。これにより、単純な垂直ジェスチャがスキップされます。

于 2013-01-24T11:06:09.967 に答える
0

http://developer.android.com/training/gestures/index.htmlを見たことがありますか? より具体的なアドバイスをするために、水平方向と垂直方向のジェスチャーで何をしようとしているのかについて、もう少し情報が必要です. しかし、水平スワイプで1つのことを行い、垂直スワイプで別のことを行うタッチ領域を持つことは間違いなく可能です. ユーザーが作成できないため、完全な直線を探していないことも重要です。

編集 (1): http://www.vogella.com/articles/AndroidGestures/article.htmlを見たことがありますか? Vogella は彼の例で、上向きのジェスチャーと横向きのジェスチャーができることをほのめかしているようですGestureOverlayView。これはあなたがやろうとしていることですか?

于 2013-01-16T05:10:13.747 に答える
0

おそらく最善の方法ではないかもしれませんが、拡張することでデフォルトの動作をオーバーライドできますGestureOverlayView

private Rect touchMove(MotionEvent event)メソッドをオーバーライドして、方向チェックを取り除く必要があります。

if (box.squareness > mGestureStrokeSquarenessTreshold ||
    (mOrientation == ORIENTATION_VERTICAL ?
        angle < mGestureStrokeAngleThreshold :
        angle > mGestureStrokeAngleThreshold)) {

    mIsGesturing = true;
    ...
    ...
}

オリエンテーションが使用される唯一の場所であるため、大幅な変更は必要ありません。単純な拡張/オーバーライドです。

もちろん、それを正しく行うには、 Replicant Projectで行ったように、を追加してORIENTATION_NONEそれに対してチェックしますが、それはその機能が再び必要になるかどうかにかかっていると思います。

于 2013-01-16T03:02:18.833 に答える