понимание использования матрицы ImageView

Я знаю, что в 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);

person Rafael T    schedule 12.07.2013    source источник
comment
в документации сказано, что вы не должны использовать матрицу, возвращаемую getImageMatrix. Посмотрите здесь   -  person Blackbelt    schedule 12.07.2013
comment
@blackbelt Я попросил объяснить, ПОЧЕМУ я не должен использовать эту Матрицу на месте, по крайней мере, если она не равна нулю ..., особенно если я установил ее раньше ...   -  person Rafael T    schedule 12.07.2013
comment
На самом деле вы спросили, ПОЧЕМУ я должен создавать новую матрицу каждый раз, когда я хочу повернуться?   -  person Blackbelt    schedule 12.07.2013
comment
@blackbelt ты прав, немного перефразировал   -  person Rafael T    schedule 12.07.2013
comment
Я думаю, что вы не должны менять матрицу, полученную из getImageMatrix , вместо этого вы должны использовать свою собственную (и можете инициализировать ее только один раз). вы можете расширить imageView и иметь там матрицу, которую можно изменить, или использовать поле матрицы для любого класса, в котором вы находитесь.   -  person android developer    schedule 06.01.2014


Ответы (1)


Глядя на исходный код, он выглядит так: в методе setImageMatrix() применяется матричный расчет. Использование этой матрицы впоследствии (т. е. после ее получения геттером) не будет иметь никакого эффекта, если вычисление выполняется в методе установки.

person mad_manny    schedule 07.07.2015