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