4

こんにちは、2本の指が画面に触れていることを検出しようとしています:

   case MotionEvent.ACTION_POINTER_2_DOWN: {

    twoFing=true;
    return true;
}

問題はそれです:

public static final int ACTION_POINTER_2_DOWN

は廃止され、ドキュメントは次のように述べています。

*getActionMasked() の定数: 非プライマリ ポインターがダウンしました。getActionIndex() を使用して、変更されたポインターのインデックスを取得します。インデックスは、getAction() によって返されるマスクされていないアクションの ACTION_POINTER_INDEX_MASK ビットでエンコードされます。*

しかし、使い方がわかりません... 2つのポインターがあることをどのように検出できますか? getPointerIndex() を試すと、ActionUP と DOwn は常にポインターが 1 つしかないと言います。

どうもありがとう

編集:問題をより明確にするために、ここに完全なコードを投稿します。私のコードは動作していますが、 ACTION_POINTER_2_DOWN は非推奨の値であるため、別のものに置き換えたいのですが、方法がわかりません。

@SuppressWarnings("deprecation")
public boolean onTouch(View v, MotionEvent event) {

switch(event.getAction()){

case MotionEvent.ACTION_DOWN : {
     Log.i(TAG, "Action Down");
    downX = event.getX(0);
    downY = event.getY(0);
    return true;
}

case MotionEvent.ACTION_UP: {


    upX = event.getX(0);
    upY = event.getY(0);

    float deltaX = downX - upX;
    float deltaY = downY - upY;
    Log.i(TAG, "Action UP deltaX="+deltaX+", deltaY="+deltaY);



    // swipe vertical?
    if(Math.abs(deltaY) > MIN_DISTANCE && twoFing){
        twoFing=false;

        // top or down
        if(deltaY < 0 ) 
        { 
            if(slide.zoom==1) 
            slide.zoom=0; 
        Log.i(TAG, "Going Down zooming in");
            //return true; 
        }
        if((deltaY > 0) )
        { 

            if(slide.zoom==0) 
                slide.zoom=1;  
            Log.i(TAG, "Going up zoomig out");
            //return true;
        }

        return true;
    }
    // swipe horizontal?
  if(Math.abs(deltaX) > MIN_DISTANCE && !twoFing){

        // left or right
        if(deltaX < 0) { this.slideToTheLeft(); return true; }
        if(deltaX > 0) { this.slideToTheRight(); return true; }
        return true;
    }

  return false;
}

case MotionEvent.ACTION_POINTER_2_DOWN: {

    twoFing=true; //inform that the touch was made with 2 fingers
    Log.i(TAG, "Action Second pointer down");

    return true;
}
}
return false;

}

4

3 に答える 3

8

私は現在、自分自身でポインターの作業を行っています。次のように切り替えたい

 switch(event.getAction() & MotionEvent.ACTION_MASK);
     case MotionEvent.ACTION_POINTER_DOWN:

ACTION_DOWN は、最初の指を下ろしたところです。ACTION_POINTER_DOWN は、2 番目の指についてです。

かなり明確な説明については、http://www.vogella.com/articles/AndroidTouch/article.htmlを参照してください。

于 2013-11-22T23:52:19.840 に答える
2

MotionEvent.ACTION_DOWNは、最初のポインター専用です。GetActionMasked() は、後続のポインターに対してMotionEvent.ACTION_POINTER_DOWNを返します。

于 2013-03-17T18:17:21.733 に答える
0

getPointerId(index)の異なる値で試しましたindexか?

Id と Index の違いを参照してください。

インデックスと ID

より高いレベルでは、時間内のスナップショットからのタッチスクリーン データは、すぐには役に立たない可能性があります。これは、タッチ ジェスチャが多くのモーション イベントにまたがる時間の経過に伴うモーションを含むためです。ポインター インデックスは、複雑なイベント全体で必ずしも一致するとは限りません。MotionEvent 内のデータの位置を示すだけです。ただし、これはアプリ自体が行う必要がある作業ではありません。各ポインターには、タッチ イベント間で持続する ID マッピングもあります。MotionEvent.getPointerId(index) を使用して各ポインターのこの ID を取得し、MotionEvent.findPointerIndex(id) を使用してポインター ID のインデックスを見つけることができます。

最善の解決策は、すべてのポインターの状態を保存し、それらを更新/比較して、新しい TouchEvent を受け取ることです。

このを確認してください。

于 2012-07-24T14:12:01.740 に答える