Android usa setRectToRect para implementar la animación RectF de escala de mapa de bits basada en la escala de matriz Matrix, Kotlin (1)

Android usa setRectToRect para implementar la animación RectF de escala de mapa de bits basada en la escala de matriz Matrix, Kotlin (1)

 

Basado en Matrix, controle el ancho y el alto del RectF objetivo de setRectToRect de Bitmap. A partir de un ancho y alto muy pequeños, aumenta iterativamente el ancho y alto del RectF objetivo de setRectToRect y agrega un cierto retraso a cada iteración para lograr una animación basada en 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)
                }
            }
        }
    }
}

 

 

 

 

Hay dos ImageView arriba y abajo. El ImageView a continuación muestra un mapa de bits que se amplía continuamente de pequeño a grande (el mismo que el mapa de bits mostrado por ImageView arriba):

bdf0f57aeb484a9fb7cd8474df97bfb3.png

9d77161a99c1414b9cbd2857f69263a6.png

 

La animación final termina: 

0c483f2507db4e6192fa5f4ebb9c8d3b.png

 

 

 

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

La matriz de Android setRectToRect recorta la matriz de mapa de bits original y la amplía, mapRect marca el área central y el artículo del blog Kotlin-CSDN se ha visto 180 veces. [Código] La matriz de Android setRectToRect recorta la imagen original del mapa de bits Matrix y la amplía, mapRect marca el área central, 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

 

Supongo que te gusta

Origin blog.csdn.net/zhangphil/article/details/135980821
Recomendado
Clasificación