如何在android中获取画布上对象的当前位置

时间:2016-12-30 07:34:36

标签: android android-canvas

我正在尝试使用CanvasSurfaceView创建一个简单的球类游戏。我想在屏幕上移动球,为此我实施了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;

    }

1 个答案:

答案 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值。希望这会有所帮助。