如何连续运动球?

时间:2014-03-21 21:05:29

标签: android

这是我现在的行动实施:

 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;



};

但我想要的是只要用户将手指放在屏幕上,球就会如上所述继续移动,而现在我需要继续移动手指以获得移动。

1 个答案:

答案 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));
}
相关问题