Android использует setRectToRect для реализации анимации RectF масштабирования растровых изображений на основе масштаба матрицы Matrix, Kotlin (1)

Android использует setRectToRect для реализации анимации RectF масштабирования растровых изображений на основе масштаба матрицы Matrix, Kotlin (1)

 

На основе Matrix управляйте шириной и высотой целевого RectF setRectToRect растрового изображения. Начиная с очень маленькой ширины и высоты, итеративно увеличивается ширина и высота целевого RectF setRectToRect, добавляя определенную задержку к каждой итерации для достижения анимации на основе 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)
                }
            }
        }
    }
}

 

 

 

 

Сверху и снизу есть два ImageView. ImageView ниже отображает растровое изображение, которое постоянно увеличивается от маленького к большому (так же, как растровое изображение, отображаемое ImageView выше):

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 обрезает исходную матрицу растрового изображения и увеличивает ее, 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