Android MultiTouch不起作用

时间:2013-07-31 08:44:50

标签: java android

 @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()。现在,如果我将手指放在屏幕的右侧,它会向右移动。左边相同。但是,如果我在不移除左手指的情况下向左和向右触摸,尽管它应该停止,但对象仍然向左移动。现在,当我离开左手指时,它仍然向左移动,尽管它应该向右移动。

我希望你能理解我的问题。

希望你能帮忙

1 个答案:

答案 0 :(得分:0)

您不能只假设ACTION_POINTER_UP事件仅针对发送的ACTION_POINTER_DOWN手指发送。

正如ACTION_DOWN事件总是在第一根手指触发时被触发一样,ACTION_UP事件仅在最后手指抬起时被触发(即在那里在屏幕上没有更多的手指)。所有其他人都会得到一个ACTION_POINTER_UP事件,即使它是开始手势的手指。

但是,Android文档会specify

  

每个指针都有一个唯一的id,当它第一次出现时被分配[和]保持有效,直到指针最终上升。

所以从理论上讲,你的第一个和第二个手指应该仍然具有相同的ID,无论报告它们的事件是什么。

解决方案很简单,然后:使用getPointerCount()getPointerID()跟踪您的手指。

如果您通过使用单个计数器替换布尔touchedLefttouchedLeft2来重构您的代码以解决两个以上的问题,这可能会更容易。 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();
    }
}