Android: как повернуть bitmap по центральной точке

Я искал более одного дня для решения этой проблемы, но ничего не помогает, даже ответы здесь. Документация ничего не объясняет.

Я просто пытаюсь получить поворот в направлении другого объекта. Проблема в том, что битмап не вращается вокруг неподвижной точки, а скорее вокруг растровых изображений (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() . Может ли кто-нибудь помочь и подтолкнуть меня в правильном направлении? 🙂

Надеюсь, следующая последовательность кода поможет вам:

 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) 

это объясняет, что он делает с переводом и переводом.

Отредактировано : оптимизированный код.

 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); 

Я вернулся к этой проблеме сейчас, когда мы завершаем игру, и я просто решил опубликовать то, что сработало для меня.

Это метод поворота матрицы:

 this.matrix.reset(); this.matrix.setTranslate(this.floatXpos, this.floatYpos); this.matrix.postRotate((float)this.direction, this.getCenterX(), this.getCenterY()); 

( this.getCenterX() – это в основном bitmap X-позиция + ширина растровых изображений / 2)

И метод рисования растрового изображения (называемый через class RenderManager ):

canvas.drawBitmap(this.bitmap, this.matrix, null);

Так что это prettey прямо вперед, но я нахожу, что это странно, что я не мог заставить его работать setRotate а затем postTranslate . Может быть, некоторые знают, почему это не работает? Теперь все растровые изображения вращаются правильно, но это не без некоторого незначительного снижения качества растрового изображения: /

В любом случае, спасибо за вашу помощь!

Вы также можете повернуть 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); 

Вы можете использовать что-то вроде следующего:

 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()); 

Посмотрите на образец от Google под названием Lunar Lander, изображение корабля будет динамически повернуто.

Пример кода Lunar Lander

Я использовал эти конфигурации и все еще имею проблему пикселизации:

 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); с 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); 
 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); 
  • Странная проблема с памятью при загрузке изображения в объект Bitmap
  • Как загрузить ImageView по URL в Android?
  • Как сохранить bitmap на внутреннем хранилище
  • Interesting Posts

    Как я могу включить и выключить свой аэропорт с распознаванием речи на моем Mac?

    База данных Azure SQL Database Bacpac Local Restore

    Подмножество data.table с использованием переменных с тем же именем, что и в столбце

    Список стандартных файлов заголовков в C и C ++

    Указание максимальной длины для многострочного текстового поля

    Получить общий тип classа во время выполнения

    Tomcat не запускается через Eclipse (таймаут)

    Что более эффективно? Используя pow для квадрата или просто умножьте его на себя?

    Создание продукта SDK: как добавить собственный lib (.so) и банку с SDK, который я создаю?

    Почему я должен выбирать Libav над FFmpeg, или есть даже разница?

    Как настроить привилегии для стандартной учетной записи пользователя?

    Как использовать Bluetooth для подключения двух iPhone?

    Что означает «Запись сброса буфера кеша»

    NoSQL Использовать сценарии использования или КОГДА использовать NoSQL

    У Android Studio есть средство просмотра иерархии?

    Давайте будем гением компьютера.