Androidに表示する画像を動的に回転させる
ImageViewに表示している画像を
ソースコード上で動的に回転や拡大を行うコードのご紹介です。
ImageViewのScaleTypeをMatrixに設定し、
ImageMatrixに対して行列演算を行うことで
動的に画像を回転させたり、
拡大したりすることができます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// 角度保存用のメンバ変数 var rot = 0.0f override fun onCreate (savedInstanceState: Bundle?) { super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) button.setOnClickListener (object: View.OnClickListener { override fun onClick (v: View?) { // 加工用に行列をコピー val tmpMatrix = imageView.imageMatrix // 保存している角度を戻す(ImageViewの中心で回転) tmpMatrix.postRotate (-rot, imageView.width * 0.5f, imageView.height * 0.5f) // エディットテキストから角度数値を取得 rot = editText.text.toString ().toFloat () textView.setText ("現在の角度:" + rot.toString ()) // 角度分回転させる(ImageViewの中心で回転) tmpMatrix.postRotate (rot, imageView.width * 0.5f, imageView.height * 0.5f) // 行列を適用 imageView.imageMatrix = tmpMatrix imageView.invalidate () } }) imageView.post (object: Runnable { override fun run () { imageView.scaleType = ImageView.ScaleType.MATRIX fitImageSize (imageView) } }) textView.setText ("現在の角度:" + rot.toString ()) editText.hint = "角度を入力" // 数字の入力のみに制限 editText.inputType = TYPE_CLASS_NUMBER } |
fitImageSize 関数はImageViewのサイズに合わせて画像を
拡大するための関数です。
高さを基準に拡大しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
private fun fitImageSize (view: ImageView) { val drawable : Drawable = view.drawable val matrix : Matrix = view.imageMatrix // 描画する画像のアスペクト比を求める val aspectRatio = drawable.intrinsicWidth / drawable.intrinsicHeight.toFloat () // viewの高さにフィットさせるので高さ基準 val viewWidth : Float = view.height * aspectRatio val viewHeight : Float = view.height * 1.0f // 画像がはみ出た量を求める val diff : Float = viewWidth - view.width // 描画する画像とviewの矩形を求め 矩形に合わせる行列を作成 val imageRectF = RectF ( 0f, 0f, drawable.intrinsicWidth.toFloat (), drawable.intrinsicHeight.toFloat () ) val viewRectF = RectF (0f, 0f, viewWidth, viewHeight) matrix.setRectToRect (imageRectF, viewRectF, Matrix.ScaleToFit.CENTER) // 画像がはみ出た分を補正して中央へ移動 matrix.postTranslate (-(diff * 0.5f), 0f) view.imageMatrix = matrix } |
タッチイベントと連動させれば簡単なゲームのようなアプリも作れそうですね。
水曜担当:Tanaka
tanaka at 2020年03月25日 10:00:35