我正在尝试使用Canvas
和SurfaceView
创建一个简单的球类游戏。我想在屏幕上移动球,为此我实施了onTouchEvent()
。我成功地能够从屏幕上的任何位置移动球。但我的问题是每当我触摸屏幕并开始移动时,球就会从触摸屏幕的位置开始移动。
我想将球从当前位置移开。如何在开始移动时获得当前位置?
这是我的onTouchEvent()
@Override
public boolean onTouchEvent(MotionEvent event) {
int updated_x = (int) event.getX();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
System.out.println("Action Up");
break;
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
draw(updated_x);
System.out.println("Action Move");
break;
}
return true;
}
我的draw
方法是:
private void draw(int updatedValue) {
canvas = surfaceHolder.lockCanvas();
canvas.drawColor(Color.RED);
canvas.drawBitmap(ball.getBitmap(), updatedValue, screenY - ball.getBitmap().getHeight() - 260, paint);
surfaceHolder.unlockCanvasAndPost(canvas);
}
这是我的 Ball.java 类:
public class Ball {
private int ball_x, ball_y;
private Bitmap bitmap;
private int minX, maxX;
public Ball(Context context, int screenX, int screenY) {
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_ball);
maxX = screenX - bitmap.getHeight();
minX = 0;
}
答案 0 :(得分:0)
这里的问题是updatedValue
是绝对位置。相反,这应该是一个delta值。
public boolean onTouchEvent(MotionEvent event) {
int updated_x = (int) event.getX();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
System.out.println("Action Up");
break;
case MotionEvent.ACTION_DOWN:
mInitial_x = updated_x;
break;
case MotionEvent.ACTION_MOVE:
final int delta_x = mInitial_x - updated_x;
draw(delta_x);
System.out.println("Action Move");
break;
}
return true;
}
在上面的代码中,我使用了一个int字段mInitial_x
来跟踪你触摸的初始位置。基于此,您现在可以获得x的变化增量值。在draw()
方法中使用此delta值来更改ball_x
,然后绘制。
这里的关键是不使用ABSOLUTE值而是使用RELATIVE值。希望这会有所帮助。