Java – Animate rotation of an image in Android

androidandroid-canvasandroid-layoutjavawear-os

  • 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!

Best Answer

Make an XML class (suppose: rotate.xml) and place it in res/anim folder and then write the following code in it:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:interpolator="@android:anim/linear_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:toDegrees="360" />

Then in your java class, do the following in OnCreate:

final Animation a = AnimationUtils.loadAnimation(CustomActivity.this,
                R.anim.rotate);
        a.setDuration(3000);
        gear00.startAnimation(a);

OR

To do it using bitmap, I hope the following sequence of code helps you:

Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config);
Canvas canvas = new Canvas(targetBitmap);
Matrix matrix = new Matrix();
matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2);
canvas.drawBitmap(source, matrix, new Paint());

If you check the following method from:

~frameworks\base\graphics\java\android\graphics\Bitmap.java

public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height,
        Matrix m, boolean filter)

this would explain what it does with rotation and translate.