Я знаю, что в SO полно вопросов о матрицах, но я не могу найти вопрос, где он полностью объяснен. Я предполагаю, что любой ImageView имеет матрицу, которая отвечает за масштабирование, вращение и положение. Но почему я не могу повернуть изображение с помощью матрицы следующим образом:
ImageView img = (ImageView)findViewById(R.id.some_imageview);
img.setScaleType(ScaleType.Matrix);
Rect bounds = img.getDrawable.getBounds();
img.getImageMatrix().postRotate(180f, bounds.width() / 2, bounds.height() / 2);
несколько ответов предлагают сделать это так:
ImageView img = (ImageView)findViewById(R.id.some_imageview);
img.setScaleType(ScaleType.Matrix);
Rect bounds = img.getDrawable.getBounds();
Matrix rotationMatrix = new Matrix();
rotationMatrix.postRotate(180f, bounds.width() / 2, bounds.height() / 2);
img.setImageMatrix(rotationMatrix);
ПОЧЕМУ я должен создавать новую матрицу каждый раз, когда я хочу повернуть? Кроме того, если я устанавливаю матрицу из второго примера, почему она не вращается снова (в исходную степень), если я снова устанавливаю rotationMatrix
? Если я хочу получить первоначальную степень, я могу установить простую построенную матрицу. но опять же, я НЕ понимаю, почему
img.getImageMatrix().postRotate(180f, bounds.width() / 2, bounds.height() / 2);
не будет работать.
Примечание. Я также пробовал метод setRotate
, не заметив никакой разницы.
РЕДАКТИРОВАТЬ: из-за комментария
Я спросил, почему я должен каждый раз создавать новую Матрицу, что подразумевает вопрос, почему я не могу использовать Матрицу на месте. Кроме того, я подозреваю, что это сработает (что на самом деле тоже не будет):
ImageView img = (ImageView)findViewById(R.id.some_imageview);
img.setScaleType(ScaleType.Matrix);
Rect bounds = img.getDrawable.getBounds();
Matrix rotationMatrix = new Matrix();
rotationMatrix.postRotate(180f, bounds.width() / 2, bounds.height() / 2);
img.setImageMatrix(rotationMatrix);
//works until here.
//Then after that successful call
//assumed to get my Matrix back, which is rotated by 180 degrees
Matrix matrix = img.getImageMatrix();
Rext bounds = img.getDrawable().getBounds()
//rotate again at 90 degree. It should be now rotated 270 degrees (180 from before, plus 90 now)
matrix.postRotate(90f, bounds.width() / 2, bounds.height() / 2);
//unfortunately NO effect!
img.setImageMatrix(matrix);