14

私は Android 開発に不慣れで、視覚障害者向けのアクセシビリティ研究プロジェクト (Jelly Bean API レベル 17 プロジェクト) に取り組んでいます。私はいくつかのジェスチャを試してきましたが、2 本指でドラッグするジェスチャは実装が非常に困難でした。次の画像は、私が実際に必要としているものをうまく捉えています。

ドラッグジェスチャー

目の不自由なユーザーに 2 本の指を水平方向 (画面上の任意の場所) にドラッグしてもらい、EditText に入力したテキストのオーディオ出力を取得します。また、ドラッグ中の 2 本の指の移動距離に応じて、各単語を個別に出力します (下の例)。

例: ユーザーが「Today is a good day」と入力し、指 (x 値) を左に 10 単位 (たとえば)ドラッグすると、 「good day」が出力されますが、20 単位を左にドラッグすると、「a good day」が出力されます。日」、左に 30 台分「良い日です」など。

2 本指のタッチを検出するように思われるものを偶然見つけました。

TouchEvent(MotionEvent event)

また、複数のタッチの検出に関するこのチュートリアルは有望に思えますが、このように実装できるかどうかわからないタッチドラッグで機能する必要があります。

これを実装するための新しい提案や役立つチュートリアルへのポインタは素晴らしいでしょう!

前もって感謝します、アディット

4

3 に答える 3

22

さて、ここのGabeとこれに関する多数のブログのおかげで、私の質問に対する解決策が見つかりました!

まず、「Activity」クラスで変数を初期化しました

int GLOBAL_TOUCH_POSITION_X = 0;
int GLOBAL_TOUCH_CURRENT_POSITION_X = 0;

次に、 onCreate() の内部:

//Two-Finger Drag Gesture detection
    RelativeLayout TextLoggerLayout = (RelativeLayout)findViewById(R.id.ActivityrView);
    TextLoggerLayout.setOnTouchListener(
            new RelativeLayout.OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent m) {
                    handleTouch(m); 
                    return true;
                }

    });

関数 handleTouch(m) を次のように定義すると、「2 本指タッチ」の現在の位置とタッチの初期位置が出力されます。

void handleTouch(MotionEvent m){
    //Number of touches
    int pointerCount = m.getPointerCount();
    if(pointerCount == 2){
        int action = m.getActionMasked();
        int actionIndex = m.getActionIndex();
        String actionString;
        TextView tv = (TextView) findViewById(R.id.testDiffText);
        switch (action)
        {
            case MotionEvent.ACTION_DOWN:                   
                GLOBAL_TOUCH_POSITION_X = (int) m.getX(1);
                actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);
                break;
            case MotionEvent.ACTION_UP:                 
                GLOBAL_TOUCH_CURRENT_POSITION_X = 0;
                actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);  
                break;  
            case MotionEvent.ACTION_MOVE:
                GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1);
                int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X;
                actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);                   
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                GLOBAL_TOUCH_POSITION_X = (int) m.getX(1);
                actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);
                break;
            default:
                actionString = "";
        }

        pointerCount = 0;
    }
    else {
        GLOBAL_TOUCH_POSITION_X = 0;
        GLOBAL_TOUCH_CURRENT_POSITION_X = 0;
    }
}

そこにあります!「2本指ドラッグ」ジェスチャーがついに実装されました。ちょっとしたブログ記事も書けそうです!! :)

于 2013-02-14T11:36:09.463 に答える
4

このような古い質問に回答を追加することがどれほど関連性があるかはわかりませんが、Androidで基本的な1本指と2本指のジェスチャーをサポートするライブラリを開発しており、機能を非常に単純に落としています。

ほとんどのジェスチャーは、次のように簡単に設定できます。

view.setOn2FingerGestureListener ( new On2FingerGestureListener () {
@Override 
onSwipeup() {
}
onSwipedown() {
}
});

これはオープンソースであり、.jar としてダウンロードすることもできます

于 2014-04-13T20:59:22.690 に答える
3

タッチ アンド ドラッグは一連のイベントです。最初にダウンがあり、次に 1 つ以上の動きがあり、次にアップがあります。ダウンの開始点を検出すると、移動中にドラッグが発生します。ドラグはアップで止まります。

2 本指でドラッグするには、次の場合にのみドラッグに注意してMotionEvent.getPointerCount() == 2ください。

于 2013-02-11T18:51:04.960 に答える