在Android中发出旋转位图

时间:2011-11-09 22:19:53

标签: android bitmap rotation

我在使位图正确旋转时遇到问题。我有一个带有多个位图的SurfaceView。这些位图存在于arraylist中并使用for循环我在onDraw方法中为每个调用canvas.drawBitmap。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.BLACK);

    for (int i = 0; i < jumper.size(); i++) {
        canvas.drawBitmap(jumper.get(i).getGraphic(), jumper.get(i)
                .getCoordinates().getX(), jumper.get(i).getCoordinates()
                .getY(), null);
    }
}

我试图让用户选择一个特定的位图(多个中的一个),然后在用户将手指拖过屏幕时旋转该位图。所以这是旋转代码。现在我只是在屏幕中心附近的某个随机位置使用默认的android图标(72x72px)。

private void rotateJumper(int direction) {
    Matrix matrix = new Matrix();
    Bitmap source = jumper.get(selectedJumperPos).getGraphic();
    matrix.postRotate(direction, source.getWidth() / 2, 
            source.getHeight() / 2);
    int x = 0;
    int y = 0;
    int width = 72;
    int height = 72;
    Bitmap tempBitmap = Bitmap.createBitmap(source, x, y, width, height,       
            matrix, true);
    jumper.get(selectedJumperPos).setGraphic(tempBitmap);
}

整数方向为+1或-1,具体取决于手指拖动的方向。因此,对于每个MotionEvent.ACTION_MOVE事件,图像应旋转1度。

以下是问题:

  1. 图像不会围绕图像中心旋转。 CW旋转以左下角为中心。 CCW旋转中心位于右上角。
  2. 由于它不是围绕中心旋转,因此图像在其初始边界之外旋转并最终消失。
  3. 图像在旋转时变得模糊。
  4. 您可以给我的任何帮助将不胜感激。

    谢谢!

2 个答案:

答案 0 :(得分:0)

请原谅我做出相当不错的回答,但是你的forloop引起了我的注意。有可能以“更具可读性”的格式编写它;

for (YourJumperItem item : jumper) {
    canvas.drawBitmap(
        item.getGraphic(), item.getCoordinates().getX(),
        item.getCoordinates().getY(), null );
}

其中YourJumperItem是您的跳线-array包含的类类型。不幸的是,关于旋转位图不能说太多,我只是在为-loops提供这种方便的写作方式。

答案 1 :(得分:0)

使用矩阵将现有位图绘制到画布而不是创建新位图:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.BLACK);

    for (int i = 0; i < jumper.size(); i++) {
        canvas.drawBitmap(jumper.get(i).getGraphic(), jumper.get(i).getMatrix(), null);
    }
}

private void rotateJumper(int direction) {
    Matrix matrix = jumper.get(selectedJumperPos).getMatrix();
    if(matrix == null) {
        matrix = new Matrix();
        matrix.setTranslate(jumper.get(...).getCoord...().getX(), jumper.get(..).getCoord...().getY());
        jumper.get(selectedJumperPos).setMatrix(matrix);
    }
    Bitmap source = jumper.get(selectedJumperPos).getGraphic();
    matrix.postRotate(direction, source.getWidth() / 2, 
            source.getHeight() / 2);

}