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如果您通过替换布尔值和touchedLeft2使用单个计数器来重构代码以考虑两个以上的手指,这可能会更容易,例如 - 它具有只需要一种方法并减少代码中的冗余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 回答