Как повернуть растровое изображение в Android о центре изображений плавно без колебательного движения
Я хочу повернуть растровое изображение на основе щелчка пользователя на 10 град. После многочисленных ответов stackoverflow и google я попробовал различные комбинации вращения матрицы.
Однако изображение на самом деле не вращается, как ожидалось, и дает нервный вид вращения + колебания вокруг центра холста. Для проверки я увеличиваю угол поворота на 10 град (вместо щелчков) каждый раз, когда вызывается метод рисования объекта. Изображение представляет собой симметричный круг [64x64, заключающий прямоугольник], и я ожидаю его чтобы вращаться в центре экрана вокруг своего собственного центра, как колесо, но оно вращается и движется по диагонали вправо-вниз и движется обратно к центру экрана колебательным образом.
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 ответов:
Вот пример. Я разбил его на 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, то вы можете изменить мой код, чтобы нарисовать его в центр и он будет работать так, как вы хотите.
Надеюсь, это поможет!
// x : x coordinate of image position // y : y coordinate of image position // w : width of canvas // h : height of canvas canvas.save(); canvas.rotate(angle, x + (w/2), y + (h/2)); canvas.drawBitmap(image, x, y, null); canvas.restore();Шаги
- сохраните существующий холст
- Поверните холст вокруг центра растрового изображения, которое вы нарисуете на холсте с углом поворота
- нарисуйте изображение
- восстановить изображение
Comments