Android は setRectToRect を使用して、Matrix マトリックス スケール、Kotlin に基づくビットマップ スケーリング RectF アニメーションを実装します (1)

Android は setRectToRect を使用して、Matrix マトリックス スケール、Kotlin に基づくビットマップ スケーリング RectF アニメーションを実装します (1)

 

Matrixに基づいて、BitmapのsetRectToRectのターゲットRectFの幅と高さを制御します。非常に小さい幅と高さから開始して、setRectToRect のターゲット RectF の幅と高さを繰り返し増加させ、各反復に一定の遅延を追加して、Matrix に基づくアニメーションを実現します。

 

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
import android.graphics.RectF
import android.os.Bundle
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext


class MainActivity : AppCompatActivity() {
    private var iv: ImageView? = null
    private var result: ImageView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        iv = findViewById(R.id.iv)
        result = findViewById(R.id.result)
    }

    override fun onResume() {
        super.onResume()

        result?.postDelayed({
            val bmp = BitmapFactory.decodeResource(resources, R.mipmap.mypic)
            matrixAnimScale(bmp, iv!!.width, iv!!.height)
        }, 500)
    }

    private fun matrixAnimScale(srcBmp: Bitmap, width: Int, height: Int) {
        val delayTime = 1L //动画之间的间隔。
        val step = 100f //100次缩放绘制,每步延时delayTime毫秒,总计 delayTime*step 毫秒完成动画。

        val deltaW: Float = width / step
        val deltaH: Float = height / step

        CoroutineScope(Dispatchers.IO).launch {
            var w = 0f
            var h = 0f

            for (i in 0 until step.toInt()) {
                delay(delayTime)

                w += deltaW
                h += deltaH

                val bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
                val c = Canvas(bmp)
                c.drawColor(Color.BLUE)

                val src = RectF(0f, 0f, srcBmp.width.toFloat(), srcBmp.height.toFloat())
                val dst = RectF(0f, 0f, w, h)
                val mx = Matrix()
                mx.setRectToRect(src, dst, Matrix.ScaleToFit.CENTER)
                c.drawBitmap(srcBmp, mx, null)

                withContext(Dispatchers.Main) {
                    result?.setImageBitmap(bmp)
                }
            }
        }
    }
}

 

 

 

 

上下に 2 つの ImageView があり、下の ImageView は、小さいものから大きいものへと連続的に拡大される Bitmap を表示します (上の ImageView で表示される Bitmap と同じです)。

bdf0f57aeb484a9fb7cd8474df97bfb3.png

9d77161a99c1414b9cbd2857f69263a6.png

 

最終的なアニメーションは次のように終了します。 

0c483f2507db4e6192fa5f4ebb9c8d3b.png

 

 

 

https://zhangphil.blog.csdn.net/article/details/135961734 https://zhangphil.blog.csdn.net/article/details/135961734

Android 行列 setRectToRect は元のビットマップ行列を切り取って拡大し、mapRect は中央領域をマークします。Kotlin-CSDN ブログ記事は 180 回閲覧されました。 [コード] Android 行列 setRectToRect は、Bitmap の元の画像 Matrix を切り取って拡大し、mapRect は中心領域をマークします。Kotlin。https://blog.csdn.net/zhangphil/article/details/135960921

https://zhangphil.blog.csdn.net/article/details/135913218 https://zhangphil.blog.csdn.net/article/details/135913218

 

おすすめ

転載: blog.csdn.net/zhangphil/article/details/135980821