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

// 角度保存用のメンバ変数
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のサイズに合わせて画像を
拡大するための関数です。
高さを基準に拡大しています。
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