Как вращать растровое изображение в Android вокруг центра изображений без плавного движения

Я хочу повернуть растровое изображение на основе щелчка пользователя на 10 град. После многочисленных ответов stackoverflow и google я попробовал различные комбинации вращения Matrix.

Однако изображение действительно не вращается, как ожидалось, и дает дрожащий вид вращения + колебания вокруг центра холста. Для тестирования я увеличиваю угол поворота на 10 град (вместо кликов) каждый раз, когда вызывается метод рисования объекта. Изображение представляет собой симметричный круг [64×64, охватывающий прямоугольник], и я ожидаю, что он повернется в центре экрана вокруг своего собственного центра, как колесо, но он вращается и перемещается по диагонали вправо вниз и перемещается назад к центру экрана осциллирующим образом ,

public void draw(Canvas canvas) { Matrix matrix = new Matrix(); rotation += 10; float px = this.viewWidth/2; float py = this.viewHeight/2; matrix.setRotate(rotation, bitmap.getWidth()/2, bitmap.getHeight()/2); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, getImgWidth(), getImgHeight(), matrix, true); canvas.drawBitmap(newbmp, px - (getImgWidth()/2), py - (getImgHeight()/2), null); } 

Вот пример. Я сломал его на 3 шага. Первый перевод перемещает растровое изображение так, что его центр равен 0,0. Затем вращение и, наконец, переместите центр растрового изображения туда, где вы хотите его на холсте. Вам не нужен второй растровый рисунок.

 Matrix matrix = new Matrix(); rotation += 10; float px = this.viewWidth/2; float py = this.viewHeight/2; matrix.postTranslate(-bitmap.getWidth()/2, -bitmap.getHeight()/2); matrix.postRotate(rotation); matrix.postTranslate(px, py); canvas.drawBitmap(bitmap, matrix, null); 

В качестве оптимизации создайте матрицу за пределами этого метода и замените создание вызовом matrix.reset()

Вам нужно перевести растровое изображение на 0,0 (или нарисуйте его на 0,0) и повернуть туда, а затем перевести обратно:

 canvas.save(); canvas.translate(this.viewWidth, this.viewHeight); canvas.rotate(rotation); canvas.drawBitmap(newbmp, -(getImgWidth()/2), -(getImgHeight()/2), null); canvas.restore(); 

Здесь я рисую его с центром в 0,0 (я думаю), потому что, когда вы вращаетесь, это примерно 0,0, а не центр экрана, как можно было бы подумать. Если вы нарисуете центр на 0,0, то он будет вращаться вокруг центра растрового изображения.

Если мой код не выполнит рисование растрового центра в 0,0, вы можете изменить мой код, чтобы нарисовать его в центре, и он будет работать так, как вы хотите.

Надеюсь это поможет!