Android矩阵Matrix变换setRectToRect,Kotlin

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里面。

Android画布Canvas裁剪区域clipRect,Kotlin-CSDN博客文章浏览阅读481次,点赞18次,收藏18次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。基础上,把剪切的区域从矩形Rect变为圆形的Path,当手指在上面的ImageView移动时候,下面同等大小对应的坐标区域显示"剪切"出来的圆形图。https://blog.csdn.net/zhangphil/article/details/135885485

相关推荐
千里马学框架4 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台5 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 小时前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc6 小时前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo7 小时前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077008 小时前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
ai2work8 小时前
ch23 综合复刻:从零做一个最小可用版本(capstone)
kotlin
其实防守也摸鱼8 小时前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
ai2work9 小时前
ch21 签名、校验与发版
kotlin
AFinalStone9 小时前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui