Android用setRectToRect实现Bitmap基于Matrix矩阵scale缩放RectF动画,Kotlin(二)
文章 https://zhangphil.blog.csdn.net/article/details/135980821 实现了基于Matrix缩放Bitmap的动画,但是从左上角(0,0)位置开始的,现在实现从中心点位置开始缩放:
XML
<?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">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:src="@mipmap/mypic" />
<ImageView
android:id="@+id/result"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Kotlin
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.withContext
class MainActivity : AppCompatActivity() {
private var mSrcImageView: ImageView? = null
private var result: ImageView? = null
override 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).bitmap
matrixAnimScale(srcBmp)
}, 800)
}
private fun matrixAnimScale(srcBmp: Bitmap) {
val delayTime = 1L //动画之间的间隔。
val step = 100f //100次缩放绘制,每步延时delayTime毫秒,总计 delayTime*step 毫秒完成动画。
val deltaW: Float = mSrcImageView!!.width / step
val deltaH: Float = mSrcImageView!!.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(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)
}
}
}
}
}
开始从中心点缩放:
逐渐变大:
变大过程:
最终: