Android: как повернуть растровое изображение по центральной точке
Я искал более одного дня для решения этой проблемы, но ничего не помогает, даже ответы здесь. Документация ничего не объясняет.
Я просто пытаюсь получить поворот в направлении другого объекта. Проблема заключается в том, что битмап не вращается вокруг неподвижной точки, а скорее вокруг растровых изображений (0,0).
Вот код, с которым у меня возникают проблемы:
Matrix mtx = new Matrix();
mtx.reset();
mtx.preTranslate(-centerX, -centerY);
mtx.setRotate((float)direction, -centerX, -centerY);
mtx.postTranslate(pivotX, pivotY);
Bitmap rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0, spriteWidth, spriteHeight, mtx, true);
this.bitmap = rotatedBMP;
Странная часть, не имеет значения, как я изменяю значения внутри pre
/postTranslate()
и аргументы float в setRotation()
. Может ли кто-нибудь помочь и подтолкнуть меня в правильном направлении?:)
Ответы
Ответ 1
Надеюсь, следующая последовательность кода поможет вам:
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());
Если вы проверите следующий метод из ~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)
это объясняет, что он делает с переводом и переводом.
Ответ 2
Отредактированный: оптимизированный код.
public static Bitmap RotateBitmap(Bitmap source, float angle)
{
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}
Получить битмап из ресурсов:
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img);
Ответ 3
Я вернулся к этой проблеме сейчас, когда мы завершаем игру, и я просто решил опубликовать то, что сработало для меня.
Это метод поворота матрицы:
this.matrix.reset();
this.matrix.setTranslate(this.floatXpos, this.floatYpos);
this.matrix.postRotate((float)this.direction, this.getCenterX(), this.getCenterY());
(this.getCenterX()
- это в основном растровое изображение X-позиция + ширина растровых изображений /2)
И метод рисования растрового изображения (вызываемый через RenderManager
класс):
canvas.drawBitmap(this.bitmap, this.matrix, null);
Так что это prettey прямо вперед, но я считаю странным, что я не мог заставить его работать setRotate
, а затем postTranslate
. Может быть, некоторые знают, почему это не работает? Теперь все растровые изображения вращаются правильно, но это не лишено какого-либо незначительного снижения качества растрового изображения:/
В любом случае, спасибо за вашу помощь!
Ответ 4
Вы также можете повернуть ImageView
с помощью RotateAnimation
:
RotateAnimation rotateAnimation = new RotateAnimation(from, to,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setDuration(ANIMATION_DURATION);
rotateAnimation.setFillAfter(true);
imageView.startAnimation(rotateAnimation);
Ответ 5
Вы можете использовать что-то вроде следующего:
Matrix matrix = new Matrix();
matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2);
RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight());
matrix.mapRect(rectF);
Bitmap targetBitmap = Bitmap.createBitmap(rectF.width(), rectF.height(), config);
Canvas canvas = new Canvas(targetBitmap);
canvas.drawBitmap(source, matrix, new Paint());
Ответ 6
Посмотрите на образец из Google под названием Lunar Lander, изображение корабля будет динамически повернуто.
Пример кода Lunar Lander
Ответ 7
Я использовал эти конфигурации и все еще имею проблему пикселизации:
Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.map_pin);
Bitmap targetBitmap = Bitmap.createBitmap((bmpOriginal.getWidth()),
(bmpOriginal.getHeight()),
Bitmap.Config.ARGB_8888);
Paint p = new Paint();
p.setAntiAlias(true);
Matrix matrix = new Matrix();
matrix.setRotate((float) lock.getDirection(),(float) (bmpOriginal.getWidth()/2),
(float)(bmpOriginal.getHeight()/2));
RectF rectF = new RectF(0, 0, bmpOriginal.getWidth(), bmpOriginal.getHeight());
matrix.mapRect(rectF);
targetBitmap = Bitmap.createBitmap((int)rectF.width(), (int)rectF.height(), Bitmap.Config.ARGB_8888);
Canvas tempCanvas = new Canvas(targetBitmap);
tempCanvas.drawBitmap(bmpOriginal, matrix, p);
Ответ 8
matrix.reset();
matrix.setTranslate( anchor.x, anchor.y );
matrix.postRotate((float) rotation , 0,0);
matrix.postTranslate(positionOfAnchor.x, positionOfAnchor.x);
c.drawBitmap(bitmap, matrix, null);