私は、Angry Birdsのように投射物をドラッグして起動しようとしています。ドラッグ部分はうまく動作しますが、タッチを離すと(つまりACTION_UP)、ボールが瞬時に境界で終わることがあり、それ以外のときはStackOverflowErrorでクラッシュします。エラーを回避して動きを滑らかにするには、どうすればよいですか?ここに私のコードです:タッチをドラッグして離した後にボールを起動する
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);
}
}
私は助けていただきありがとうございます。ありがとうございました。
例外を指定してLogCat出力を送信する必要があります。 – azertiti
xMaxとyMaxとは何ですか?あなたはこれをデバッガで踏んだことがありますか? – derekerdmann