SurfaceView - Bitmap在检测输入时很奇怪

时间:2012-07-28 14:09:47

标签: android multithreading bitmap surfaceview android-canvas

我在Android中创建了一个游戏循环,扩展了SurfaceView类和Thread类,类似于Android示例中的Lunar Lander示例。现在我只是试图找到一种方法让用户使用onTouchEvent在屏幕上拖动位图来接收有关触摸位置的信息,然后查看它是否在我的某个位图的范围内并移动该位图的相应的X和Y位置。这有时会起作用,但有时它可能会将图像移动到我触摸的位置,即使它远远超出它的界限,只要我按下靠近其他图像。

我不知道这个错误行为来自哪里,我还没有实现任何减缓线程速度的方法,以便它不使用最大CPU - 这是否会使得它产生这些结果的延迟?如果有人能对此有所了解,我会非常感激。

我正在获取用户输入并传递给自定义方法handleAction'(actionName)'

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        thread.handleActionDown((int) event.getX(), (int)event.getY());
    }
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        if (thread.isTouched()) {
            thread.handleActionMove((int) event.getX(), (int) event.getY());
        }   
    }
    if (event.getAction() == MotionEvent.ACTION_UP) {
        if (thread.isTouched()) {
            thread.handleActionUp();
        }
    }       
    return true;
}   

以下是我的处理程序方法:

tizer是一个Bitmap和TizerX& Y是X和Y位置的类变量,ball是相同的。

public void handleActionDown(int eventX, int eventY) {
    if (eventX >= (TizerX - tizer.getWidth() / 2) && (eventX <= (TizerX + tizer.getWidth() / 2))) {
        if (eventY >= (TizerY - tizer.getHeight() / 2) && (TizerY <= (TizerY + tizer.getHeight() / 2))) {
            setTouched(true);
            if(getBitmapTouched() == "") {
                setBitmapTouched("tizer");
            }               
        } else {
            setTouched(false);
            setBitmapTouched(null);
        }
    } else if (eventX >= (BallX - ball.getWidth() / 2) && (eventX <= (BallX + ball.getWidth() / 2))) {
        if (eventY >= (BallY - ball.getHeight() / 2) && (BallY <= (BallY + ball.getHeight() / 2))) {
            setTouched(true);
            if(getBitmapTouched() == "") {
                setBitmapTouched("ball");
            }   
        } else {
            setTouched(false);
            setBitmapTouched("");
        }
    } else {
        setTouched(false);
        setBitmapTouched("");
    }
}

public void handleActionUp() {
    // TODO Auto-generated method stub
    setTouched(false);
    setBitmapTouched("");
}


public void handleActionMove(int eventX, int eventY) {
    if(isTouched()) {
        if(getBitmapTouched() == "tizer") {
            setTizerX(eventX);
            setTizerY(eventY);
        } else if (getBitmapTouched() == "ball") {
            setBallX(eventX);
            setBallY(eventY);
        }           
    }

我的帖子经常调用doDraw方法:

private void doDraw(Canvas canvas) {
    // Draw the background image. Operations on the Canvas accumulate
    // so this is like clearing the screen.
    canvas.drawColor(Color.BLACK);
    canvas.drawBitmap(testBackgroundImage, 0, 0, null);
    canvas.drawBitmap(tizer, TizerX - (tizer.getWidth() / 2), TizerY - (tizer.getHeight() / 2), null);
    canvas.drawBitmap(ball, BallX - (ball.getWidth() / 2), BallY - (ball.getHeight() / 2), null);
}

尽管在互联网和Stack Overflow上查看了无数的例子以正确的方式来查看是否触摸了Bitmap我仍然没有做到正确,我没有在LogCat中收到错误因此我没有还有其他什么可以展示,如果你设法在代码中发现看似奇怪的东西,请告诉我。

0 个答案:

没有答案