Android用setRectToRect实现Bitmap基于Matrix矩阵scale缩放RectF动画,Kotlin(二)
文章 https://zhangphil.blog.csdn.net/article/details/135980821 实现了基于Matrix缩放Bitmap的动画,但是从左上角(0,0)位置开始的,现在实现从中心点位置开始缩放:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/darker_gray"android:orientation="vertical"tools:context=".MainActivity"><ImageViewandroid:id="@+id/iv"android:layout_width="match_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"android:src="@mipmap/mypic" /><ImageViewandroid:id="@+id/result"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
import android.graphics.RectF
import android.graphics.drawable.BitmapDrawable
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.withContextclass MainActivity : AppCompatActivity() {private var mSrcImageView: ImageView? = nullprivate var result: ImageView? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)mSrcImageView = findViewById(R.id.iv)result = findViewById(R.id.result)}override fun onResume() {super.onResume()result?.postDelayed({val srcBmp = (mSrcImageView?.drawable as BitmapDrawable).bitmapmatrixAnimScale(srcBmp)}, 800)}private fun matrixAnimScale(srcBmp: Bitmap) {val delayTime = 1L //动画之间的间隔。val step = 100f //100次缩放绘制,每步延时delayTime毫秒,总计 delayTime*step 毫秒完成动画。val deltaW: Float = mSrcImageView!!.width / stepval deltaH: Float = mSrcImageView!!.height / stepCoroutineScope(Dispatchers.IO).launch {var w = 0fvar h = 0ffor (i in 0 until step.toInt()) {delay(delayTime)w += deltaWh += deltaHval bmp = Bitmap.createBitmap(mSrcImageView!!.width, mSrcImageView!!.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)//移动矩阵到中心位置点缩放。mx.postTranslate(mSrcImageView!!.width / 2f - dst.width() / 2f, mSrcImageView!!.height / 2f - dst.height() / 2f)c.drawBitmap(srcBmp, mx, null)withContext(Dispatchers.Main) {result?.setImageBitmap(bmp)}}}}
}
开始从中心点缩放:
逐渐变大:
变大过程:
最终:
https://zhangphil.blog.csdn.net/article/details/135980821