这是我现在的行动实施:
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
move_ball=true;
check_collisions();
x+=speed_x;
y+=speed_y;
invalidate();
Log.d("down", String.valueOf(x)+" "+String.valueOf(y));
break;
}
case MotionEvent.ACTION_UP:
move_ball=false;
Log.d("up", String.valueOf(x)+" "+String.valueOf(y));
break;
}
return true;
};
但我想要的是只要用户将手指放在屏幕上,球就会如上所述继续移动,而现在我需要继续移动手指以获得移动。
答案 0 :(得分:2)
这是一个带有surfaceView的完整工作示例。看看我是怎么做到的,你必须抓住一次触摸坐标,然后用更新方法将球移到那里。更改更新方法以更改球的移动。
public class BallView extends SurfaceView implements Runnable, SurfaceHolder.Callback {
private float ballX;
private float ballY;
private float touchX;
private float touchY;
private Paint ballPaint,backgroundPaint;
private ExecutorService service;
public BallView(Context context) {
super(context);
getHolder().addCallback(this);
ballPaint = new Paint();
ballPaint.setColor(Color.RED);
backgroundPaint = new Paint();
backgroundPaint.setColor(Color.BLACK);
}
public void update() {
float deltaX = touchX - ballX;
float deltaY = touchY - ballY;
ballX+=deltaX/100;
ballY+=deltaY/100;
}
public void doDraw(Canvas canvas) {
canvas.drawPaint(backgroundPaint);
canvas.drawCircle(ballX, ballY, 100, ballPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i("Touch","Event");
if(event.getAction()==MotionEvent.ACTION_UP) {
touchX = event.getX();
touchY = event.getY();
}
return true;
}
private boolean running;
@Override
public void run() {
running = true;
while(running) {
update();
Canvas canvas = getHolder().lockCanvas();
if(canvas!=null) {
doDraw(canvas);
getHolder().unlockCanvasAndPost(canvas);
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(service == null) service = Executors.newSingleThreadExecutor();
service.execute(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
running = false;
}
}
MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(new BallView(this));
}