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



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム