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
  • Как сохранить bitmap на внутреннем хранилище
  • Сохранить bitmap в местоположении
  • Interesting Posts

    Android: Какой ответный код делает V3-приложение для выставления счетов в ожидании?

    Каковы все общие неопределенные типы поведения, о которых должен знать программист на C ++?

    Вычислите новую координату x метров и y gradleус от одной координаты

    Совместимость с RAM

    Почему JPA имеет аннотацию @Transient?

    Как я могу построить свой тестовый пакет асинхронно?

    Критерии оценки качества ЖК-монитора

    Сохранение сеанса ASP.NET Open / Alive

    Перспективы всегда отправляются с одного и того же адреса

    Как я могу добраться до корзины без значка рабочего стола в Windows 7?

    Размытие изображения в Word 2013, когда оно было размещено

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

    Выполнить функцию оболочки с тайм-аутом

    Как избавиться от `устаревшего преобразования из строковой константы в ‘char *’ ‘предупреждения в GCC?

    Почему BitmapFactory.decodeByteArray возвращает значение null?

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