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

相关推荐
默阳123414 小时前
2026年Android中高级面试题专栏(Android进阶篇)
android
古法安卓15 小时前
Android-日志系统源码解析
android·java·android studio
恋猫de小郭15 小时前
Android 17 + OkHttp 5.5.0 ,全新 ECH 下你的 HTTPS 域名可以请求时被安全隐藏
android·前端·flutter
小强闯江湖15 小时前
不只是让 AI 写代码:ViewCompose 把 Android UI 做成了可编译、可渲染的闭环
android·人工智能·kotlin
hunterandroid17 小时前
StateFlow 与 SharedFlow 的边界:状态与事件的正确建模
android·前端
YF021117 小时前
Android遥控器对频详解
android·android things
码农coding18 小时前
android12 WindowManagerService窗口的布局过程
android·源码
杉氧21 小时前
状态管理变迁史:为什么我们放弃了 Redux 选择 Zustand?
android·前端·react native
三少爷的鞋1 天前
别再靠 Code Review 守底线:我做了一个静态分析项目 RedLine
android
y = xⁿ1 天前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习