Android 拖动并释放触球后发射球

Android 拖动并释放触球后发射球,android,Android,我正试着像愤怒的小鸟一样拖拽并发射炮弹。拖动部分工作正常,但当我释放触摸即动作时,有时球会立即停在边界处,而另一些时候,它会与StackOverflowerr一起崩溃。我应该做些什么来避免错误并使运动平稳?这是我的密码: public class BallView extends View{ static Log log; Bitmap ball; float xStart; float yStart; float xCurrent; float yCurrent; int xMax; int

我正试着像愤怒的小鸟一样拖拽并发射炮弹。拖动部分工作正常,但当我释放触摸即动作时,有时球会立即停在边界处,而另一些时候,它会与StackOverflowerr一起崩溃。我应该做些什么来避免错误并使运动平稳?这是我的密码:

public class BallView extends View{

static Log log;
Bitmap ball;
float xStart;
float yStart;
float xCurrent;
float yCurrent;
int xMax;
int yMax;
float xVector;
float yVector;

public BallView(Context context){
    super(context);
    this.setFocusable(true);
    ball = BitmapFactory.decodeResource(getResources(), R.drawable.ball);
    xStart = 125;
    yStart = 275;
    xCurrent = xStart;
    yCurrent = yStart;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    xMax = MeasureSpec.getSize(widthMeasureSpec);
    yMax = MeasureSpec.getSize(heightMeasureSpec);
    setMeasuredDimension(xMax, yMax);
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(ball, xCurrent, yCurrent, null);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    int eventaction = event.getAction();
    int X = (int)event.getX(); 
    int Y = (int)event.getY(); 

    switch (eventaction ) {
    case MotionEvent.ACTION_DOWN:
        break;
    case MotionEvent.ACTION_MOVE:
        xCurrent = X-30;
        yCurrent = Y-30;
        break; 

    case MotionEvent.ACTION_UP:
        Log.d("actionup", "done");
        xCurrent = X-30;
        yCurrent = Y-30;
        xVector = xStart-xCurrent;
        yVector = yStart-yCurrent;
        break;
    } 
    invalidate();
    if (eventaction == MotionEvent.ACTION_UP){
        launch(xVector, yVector);
    }
    return true; 
}

private void launch(float xVector, float yVector) {
    xCurrent = xCurrent + xVector;
    yCurrent = yCurrent + yVector;
    if (xCurrent < 0 || xCurrent > xMax || yCurrent < 0 || yCurrent >yMax){
        return;
    }
    invalidate();
    launch(xVector, yVector);
}
}

感谢您的帮助。谢谢。

Hmm,没有来自错误跟踪的特定信息:堆栈溢出错误通常发生在失控的递归函数中。对于您来说,在启动中,如果xCurrent=0、xMax=1000000和xVector=0.001,您可能会创建一个stackoverflow。我会在这里开始调试

此外,您似乎在同一范围内声明了名称相同的变量,即xVector和yVector作为类成员变量,并且它们也在launchfloat xVector和float yVector中声明。这可能会让你或其他人感到困惑。尝试使用不同的变量名和常规命名方案

最后,一个有用的运算符是+=,它需要:

xCurrent=xCurrent+xVector

并将其缩短为:

xCurrent+=xVector

这样可以节省一些不必要的打字。祝你好运

您的启动方法似乎是一个糟糕的递归调用。看这个


您应该发布LogCat输出,但有一个异常。什么是xMax和yMax?你有没有在调试器中处理过这个问题?我添加了睡眠时间,这样递归启动方法就不会经常被调用,而且可以正常工作。非常感谢。
private void launch(float xVector, float yVector) {
    new Thread(new Runnable() {

        @Override
        public void run() {
            while (!(xCurrent + xVector < 0 || xCurrent + xVector > xMax || 
                    yCurrent + yVector < 0 || yCurrent + yVector > yMax)){

                xCurrent = xCurrent + xVector;
                yCurrent = yCurrent + yVector;
                try{
                    Thread.sleep(200);
                }catch(Exception e){
                }
                postInvalidate();
            }
        }
    }).start;
}