Я делаю игру для Android, и мне нужно повернуть изображение. Когда я поворачиваю его, очевидно, меняются его размеры. Например, когда он повернут на 45 градусов (это квадрат, но я бы хотел, чтобы это работало для любого прямоугольника, поэтому это более общее решение), его ширина и высота становятся длиной диагонали, которая длиннее оригинала. После некоторой алгебры вы можете понять, что масштабный коэффициент равен sqrt (2). Но единственный способ, которым я знаю, чтобы вращать растровое изображение, это с помощью матрицы. Пример:
matrix.postRotate(degrees);
rotated = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true);
При использовании этого метода размер растрового изображения остается постоянным, поэтому для поворота повернутого изображения в содержимое изображения необходимо его уменьшить. Что вызывает мою проблему.
То, что у меня сейчас есть, должно работать, а когда работает - нет. Вероятно, потому что это слишком сложно, тем не менее, вот оно:
float totalRotated = 0;
public void rotate(float degrees){
if(mBitmap != null){
float increment = (float)((mBitmap.getWidth()/45.0)*(Math.sqrt(2)-1));
totalRotated += degrees;
totalRotated -= (float)((int)totalRotated/360)*360;
matrix.reset();
matrix.setRotate(totalRotated);
rotated = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true);
rotated = Bitmap.createScaledBitmap(rotated, (int)(mBitmap.getWidth()+(((Math.abs(Math.abs(((int)totalRotated%90)-45)-45)))*increment)), (int)(mBitmap.getHeight()+(((Math.abs(Math.abs(((int)totalRotated%90)-45)-45)))*increment)), true);
}
}
Используя функцию Log.d
, я смог определить, что размеры, заданные в последнем утверждении, соответствуют моим ожиданиям, но размер изображения не изменяется. Так как это даже не работает, мне нужен лучший способ сделать это или способ исправить мой метод. Также мой метод работает только для квадратов. Итак, как я могу это сделать?
EDIT:
Мой метод работает, я просто не звонил setBounds()
Это не может быть единственным способом сделать это, хотя это так неэффективно.