0
 @Override 
public boolean onTouchEvent(MotionEvent event)
{ 
    synchronized (getHolder())
    {   
        int aktion = event.getAction();
        if (aktion == MotionEvent.ACTION_DOWN)
        {
            touched = true;
            bar.shareTouch(event.getX(), event.getY(), touched);
        }
        else if (aktion == MotionEvent.ACTION_UP)
        {
            touched = false;
            bar.shareTouch(event.getX(), event.getY(), touched);
        }
            if (aktion == MotionEvent.ACTION_POINTER_DOWN)
        {
            touched2 = true;
            bar.shareTouch2(event.getX(), event.getY(), touched2);
        }
        else if (aktion == MotionEvent.ACTION_POINTER_UP) 
        {
            touched2 = false;
            bar.shareTouch2(event.getX(), event.getY(), touched2);
        }
    }
    return true;
}

これは、最初の指が画面に出ようとしているかどうかを確認するためのコードです。別の指も同様。

public void shareTouch2(float xTouch2, float yTouch2, boolean touched2)
{
    if (xTouch2 <= gameViewWidth/2) {
        if (touched2 == true) {
            touchedLeft2 = true;
        }
        else if(touched2 == false) {
            touchedLeft2 = false;
        }
    }
    else if (xTouch2 > gameViewWidth/2) {
        if (touched2 == true) {
            touchedRight2 = true;
        }
        else if(touched2 == false) {
            touchedRight2 = false;
        }
    }
}

public void shareTouch(float xTouch, float yTouch, boolean touched)
{
    if (xTouch <= gameViewWidth/2) {
        if (touched == true) {
        touchedLeft = true;
        }
        else if(touched == false) {
            touchedLeft = false;
        }
    }
    else if (xTouch > gameViewWidth/2) {
        if (touched == true) {
            touchedRight = true;
        }
        else if(touched == false) {
            touchedRight = false;
        }
    }

}

private void moveRight()
{
    x += 3;
}

private void moveLeft()
{
    x -= 3;
}

private void checkTouch() {
    if ((touchedLeft == true && touchedRight2 == false) || (touchedLeft2 == true && touchedRight == false)) {
        moveLeft();
    }
    else if ((touchedLeft == false && touchedRight2 == true) || (touchedLeft2 == false && touchedRight == true)) {
        moveRight();
    }
    else if ((touchedLeft == true && touchedRight2 == true) || (touchedLeft2 == true && touchedRight == true)) {

    }
}

はメソッドcheckTouch()で呼び出されます。onDraw()画面の右側に指を置くと、右に移動します。左も同じ。しかし、左指を離さずに左と右に触れると、オブジェクトは停止するはずなのに左に移動します。左の指を離しても、右に移動するはずなのに左に移動します。

私の問題を理解していただければ幸いです。

あなたが助けてくれることを願っています

4

1 に答える 1

0

ACTION_POINTER_UPイベントが送信されたのと同じ指に対してのみ送信されると想定することはできませんACTION_POINTER_DOWN

ACTION_DOWN最初の指がタッチダウンしたときにイベントが常に発生するように、ACTION_UPイベントは最後の指が離されたとき (つまり、画面に指がなくなったとき) にのみ発生します。ACTION_POINTER_UPジェスチャを開始したのが指であっても、他のすべての人はイベントを取得します。

ただし、Androidのドキュメントでは指定されています

各ポインターには一意の ID があり、最初にダウンしたときに割り当てられます [そして] ポインターが最終的にアップするまで有効なままです。

したがって、理論的には、イベントがそれらを報告するかどうかに関係なく、人差し指と人差し指は同じ ID を持つ必要があります。

解決策は簡単です。getPointerCount()getPointerID()を使用して、指を追跡します。

touchedLeftこれは、ブール値をtouchedLeft21 つのカウンターに置き換えることで 2 つ以上のフィンガーを考慮してコードをリファクタリングする場合に簡単になる場合があります。たとえば、1 つのメソッドのみを必要とするだけでなく、コードの冗長性を減らすという適切fingersOnLeftSideな副作用があります。shareTouch()

編集:

免責事項:これは私の頭の中で、テストされておらず、投稿したもの以外のコードを知らずに書かれています。あなたの問題を解決するための最良の方法とは限りませんが、私が考えることができる最短の方法です。

これはイベント ハンドラです。

public boolean onTouchEvent(MotionEvent event)
{
    synchronized (getHolder())
    {   
        int aktion = event.getAction();
        if (aktion == MotionEvent.ACTION_DOWN || aktion == MotionEvent.ACTION_POINTER_DOWN
        || aktion == MotionEvent.ACTION_UP || aktion == MotionEvent.ACTION_POINTER_UP)
        {
            bar.clearTouches();
            for (int i = 0; i < event.getPointerCount(); i++) {
                bar.shareTouch(event.getX(i)); // we don't need the y coordinate anyway
            }
        }
    }
    return true;
}

shareTouch()それに合わせて書き直したものと、clearTouches()これを簡単にするために紹介したもの:

private void shareTouch(float x) 
{
    if (x < gameViewWidth/2) {
        fingersLeft++;
    } else {
        fingersRight++;
    }
}

private void clearTouches() 
{
    fingersLeft = 0;
    fingersRight = 0;
}

そして最後に、新しいcheckTouch():

public void checkTouch()
{
    if (fingersLeft > fingersRight) {
        moveLeft();
    } else if (fingersRight > fingersLeft) {
        moveRight();
    }
}
于 2013-07-31T11:50:52.620 に答える