如何在画布上用x点旋转位图?

时间:2015-06-12 05:51:37

标签: android canvas bitmap

我正在尝试开发一款简单的游戏。我的问题是我试图通过触摸侦听器中的“x”事件来旋转屏幕底部的箭头图像。

以下是我的箭类:

public class Arrow extends GameObject{

    boolean show = true;
    Bitmap bmp;
    Game game;
    Matrix matrix;
    int i = 0;
    public Arrow(Handler handler, int x, int y, int xSpeed, int ySpeed , Game game) {
        super(handler, x, y, xSpeed, ySpeed);
        this.game = game;   
        bmp = BitmapFactory.decodeResource(game.getResources(), R.drawable.arrow);

         matrix = new Matrix();

    }

    @Override
    public void tick() {

    }

    @Override
    public void render(Canvas c) {

            matrix.postRotate(x);
            c.drawBitmap(bmp,matrix, null);
    }

}

这是Event Listener       @覆盖       public boolean onTouch(View v,MotionEvent event){

    x = (int) event.getX();
    y = (int) event.getY();

                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    arrow.setX(x);
                    break;
                case MotionEvent.ACTION_MOVE :
                    touch.move();
                    break;
                case MotionEvent.ACTION_UP:
                    break;
                }
            }
        }
    }
    return true;
}

here is a picture that shows what I mean

如何编写旋转位图的代码?

2 个答案:

答案 0 :(得分:1)

这是一个例子。

Matrix matrix = new Matrix();
//Calculate the rotation of the bitmap.
rotation += 10;
matrix.postRotate(rotation); // or matrix.postRotate(rotation,cx,cy);
canvas.drawBitmap(bitmap, matrix, null);

作为优化,在此方法之外创建一次Matrix,并通过调用matrix.reset()替换创建。
这样,画布像以前一样保持定向,你可以用{做更多的东西{3}}像翻译,缩放等,矩阵的内容封装了你操纵的真正含义。

计算角度:

要首先计算角度,您需要知道Seekbar的总进度长度(进度的最小值 - 进度的最大值)以及搜索后的值的变化。
考虑

Min of seek bar = 0
Max value of seekbar  = 30

现在计算每单位的角度,

1 unit = 360/30 = 12.

假设用户已将搜索栏位置从10更改为20.现在计算diff

int diff = 10-20 = -10.

rotation angle  = (-10 * 12) = -120;

示例2:

如果用户将搜索栏位置从15更改为10.现在计算差异

int diff = 15-10 = 5.

rotation angle  = (5 * 12) = 60;

答案 1 :(得分:1)

以下是我自己的问题的答案,它根据x输入数据旋转图像:

float zeroPoint =MainGame.SCREEN_W / 2;

zeroPoint-=x;

float lala = MainGame.SCREEN_W/(180-y);

matrix.setRotate(zeroPoint/=lala, bmp.getWidth() /2, bmp.getHeight());