Search code examples
javaandroidandroid-layoutandroid-canvaswear-os

Animate rotation of an image in Android


  • I have a gear image which I want to continuously rotate about a fixed point.

  • Earlier I was accomplishing this by including the image in my Android class as an ImageView and applying a RotateAnimation to it.

    @InjectView(R.id.gear00)              ImageView gear00;
    RotateAnimation ra07 = new RotateAnimation(0, 359, 129, 186);
    ra07.setDuration(10000);
    ra07.setRepeatCount(RotateAnimation.INFINITE);
    ra07.setInterpolator(new LinearInterpolator());
    gear00.setAnimation(ra07);
    

Basically, I was injecting the ImageView into the class and applying a rotation animation.

However, I dont have the luxury of using an ImageView anymore. I have to use a Bitmap and rotate it on the canvas.

How can I go about accomplishing what I was doing earlier in the onDraw() method with a bitmap rotating about a fixed point continiously on the canvas?

Edit1:

I tried one of the suggestions mentioned below my code looks a little like the following

in onCreate():

Matrix matrix = new Matrix();
matrix.setRotate(10, 100, 200);

Then in onDraw() (where gear00Scaled is a bitmap to be rotated on the canvas):

canvas.drawBitmap(gear00Scaled, matrix, new Paint());

Another method I tried involved saving the canvas, rotating it, then restoring it:

canvas.save();
canvas.rotate(10);
canvas.drawBitmap(gear00Scaled, 100, 200, null);
canvas.restore();

Neither seem to be working though!


Solution

  • In your onCreate() do

    Matrix matrix = new Matrix();
    

    And in onDraw

    float angle = (float) (System.currentTimeMillis() % ROTATE_TIME_MILLIS) 
       / ROTATE_TIME_MILLIS * 360;
    matrix.reset();
    matrix.postTranslate(-source.getWidth() / 2, -source.getHeight() / 2);
    matrix.postRotate(angle);
    matrix.postTranslate(centerX, centerY)
    canvas.drawBitmap(source, matrix, null);
    invalidate(); // Cause a re-draw
    

    ROTATE_TIME_MILLIS is the full circle time, e.g. 2000 is 2 seconds.