Android矩阵Matrix变换setRectToRect,Kotlin
在 Android画布Canvas裁剪区域clipRect,Kotlin-CSDN博客 基础上,增加一个点,通过setRectToRect挖出Bitmap原图中心区域的一块放到目标RectF里面。
Kotlin
import android.content.Context
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.util.AttributeSet
import android.util.SizeF
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatImageView
class MainActivity : AppCompatActivity() {
private var iv: MyImageView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
iv = findViewById(R.id.iv)
val result = findViewById<ImageView>(R.id.result)
iv?.setTestImageView(result)
}
}
class MyImageView : AppCompatImageView {
private var mSrcBmp: Bitmap? = null
private var testIV: ImageView? = null
private val mSizeF = SizeF(500f, 200f)
constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {
//mSrcBmp是原始图大小,没有缩放和拉伸的。
mSrcBmp = (drawable as BitmapDrawable).bitmap
}
fun setTestImageView(imageView: ImageView) {
testIV = imageView
}
override fun onDraw(canvas: Canvas) {
val cx = this.width / 2
val cy = this.height / 2
val srcRectF = RectF(cx - mSizeF.width / 2, cy - mSizeF.height / 2, cx + mSizeF.width / 2, cy + mSizeF.height / 2)
canvas.clipRect(srcRectF)
super.onDraw(canvas)
val bmp = Bitmap.createBitmap(mSizeF.width.toInt(), mSizeF.height.toInt(), Bitmap.Config.ARGB_8888)
val c = Canvas(bmp)
c.drawColor(Color.BLUE)
//选取源bitmap的一块中心区域。
val bmpCenterX = mSrcBmp!!.width / 2
val bmpCenterY = mSrcBmp!!.height / 2
val bmpRectF = RectF(
bmpCenterX - mSizeF.width / 2,
bmpCenterY - mSizeF.height / 2,
bmpCenterX + mSizeF.width / 2,
bmpCenterY + mSizeF.height / 2
)
val dstRectF = RectF(0f, 0f, mSizeF.width, mSizeF.height)
val matrix = Matrix()
//把bitmap中心区域的那一块放到目标的dstRectF里面。
matrix.setRectToRect(bmpRectF, dstRectF, Matrix.ScaleToFit.CENTER)
c.drawBitmap(mSrcBmp!!, matrix, null)
testIV?.setImageBitmap(bmp)
}
}
上图是clipRect裁剪剪切区域绘制出来的中心区域图。
下面是setRectToRect"挖"出Bitmap中心区域的一块放到目标Bitmap里面。