Rotating Image on A canvas in android

You can either rotate your bitmap when you draw it by using a matrix:

Matrix matrix = new Matrix();
matrix.setRotate(angle, imageCenterX, imageCenterY);
yourCanvas.drawBitmap(yourBitmap, matrix, null);

You can also do it by rotating the canvas before drawing:

yourCanvas.save(Canvas.MATRIX_SAVE_FLAG); //Saving the canvas and later restoring it so only this image will be rotated.
yourCanvas.rotate(-angle);
yourCanvas.drawBitmap(yourBitmap, left, top, null);
yourCanvas.restore();

Pick the one that suits you the best.


You have to rotate the canvas first and then draw whatever you want. Then the object drawn will be appeared as rotated on screen.

canvas.rotate(45); // degrees to rotate

try this its good way.

Check this tutorial you will get information about how to draw bitmap and how to rotate canvas

Check complete tutorial


This is the only one that worked for me with no problem.

    private Bitmap rotateBitmap(Bitmap bitmap, int rotationAngleDegree){

        int w = bitmap.getWidth();
        int h = bitmap.getHeight();

        int

 newW=w, newH=h;
    if (rotationAngleDegree==90 || rotationAngleDegree==270){
        newW = h;
        newH = w;
    }
    Bitmap rotatedBitmap = Bitmap.createBitmap(newW,newH, bitmap.getConfig());
    Canvas canvas = new Canvas(rotatedBitmap);

    Rect rect = new Rect(0,0,newW, newH);
    Matrix matrix = new Matrix();
    float px = rect.exactCenterX();
    float py = rect.exactCenterY();
    matrix.postTranslate(-bitmap.getWidth()/2, -bitmap.getHeight()/2);
    matrix.postRotate(rotationAngleDegree);
    matrix.postTranslate(px, py);
    canvas.drawBitmap(bitmap, matrix, new Paint( Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.FILTER_BITMAP_FLAG ));
    matrix.reset();

    return rotatedBitmap;
}

Based on @Sakthi 's code, but add scaling :)

        Rect rect = new Rect(0,0,canvas.getWidth(), canvas.getHeight());
        Matrix matrix = new Matrix();
        matrix.postTranslate(-bitmap.getWidth()/2, -bitmap.getHeight()/2);
        matrix.postScale(
                ((float)rect.width()) / bitmap.getWidth(),
                ((float)rect.height()) / bitmap.getHeight());
        matrix.postRotate(180);
        matrix.postTranslate(rect.exactCenterX(), rect.exactCenterY());
        canvas.drawBitmap(bitmap, matrix, null);

@Reham: Look at this example code below,

public class bitmaptest extends Activity {
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    LinearLayout linLayout = new LinearLayout(this);

    // load the origial BitMap (500 x 500 px)
    Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),
           R.drawable.android);

    int width = bitmapOrg.width();
    int height = bitmapOrg.height();
    int newWidth = 200;
    int newHeight = 200;

    // calculate the scale - in this case = 0.4f
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;

    // createa matrix for the manipulation
    Matrix matrix = new Matrix();
    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);
    // rotate the Bitmap
    matrix.postRotate(45);

    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,
                      width, height, matrix, true);

    // make a Drawable from Bitmap to allow to set the BitMap
    // to the ImageView, ImageButton or what ever
    BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);

    ImageView imageView = new ImageView(this);

    // set the Drawable on the ImageView
    imageView.setImageDrawable(bmd);

    // center the Image
    imageView.setScaleType(ScaleType.CENTER);

    // add ImageView to the Layout
    linLayout.addView(imageView,
            new LinearLayout.LayoutParams(
                  LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT
            )
    );

    // set LinearLayout as ContentView
    setContentView(linLayout);
}
}

you have to use the matrix to rotate image look the lines

matrix.postRotate(45); -

this will rotate the image to 45 degrees

Hope this help you ...thx