8

SOがマトリックスの質問でいっぱいであることは知っていますが、完全に説明されている質問を見つけることができません. ImageView には、スケーリング、回転、および位置を担当する Matrix があると思います。しかし、なぜこのようなマトリックスを使用して画像を回転できないのですか:

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

回転するたびに新しいマトリックスを作成する必要があるのはなぜですか? さらに、2 番目の例のマトリックスを設定した場合、もう一度設定しても (元の角度まで) 回転しないのはなぜ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);
4

1 に答える 1