Android矩阵Matrix实现Glide图像fitCenter转换为centerCrop,Kotlin

Android矩阵Matrix实现Glide图像fitCenter转换为centerCrop,Kotlin

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:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/image1"
        android:layout_width="500px"
        android:layout_height="500px"
        android:background="@android:color/holo_green_light" />

    <ImageView
        android:id="@+id/image2"
        android:layout_width="500px"
        android:layout_height="500px"
        android:background="@android:color/holo_blue_light" />

    <ImageView
        android:id="@+id/image3"
        android:layout_width="500px"
        android:layout_height="500px"
        android:background="@android:color/holo_red_light" />

    <ImageView
        android:id="@+id/image4"
        android:layout_width="500px"
        android:layout_height="500px"
        android:background="@android:color/holo_orange_light" />

</LinearLayout>
Kotlin 复制代码
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
import android.graphics.RectF
import android.os.Bundle
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target

class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "fly"
        const val SIZE = 500
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val image1 = findViewById<ImageView>(R.id.image1)
        val image2 = findViewById<ImageView>(R.id.image2)
        val image3 = findViewById<ImageView>(R.id.image3)
        val image4 = findViewById<ImageView>(R.id.image4)

        Glide.with(this)
            .load(R.mipmap.pic)
            .fitCenter()
            .override(SIZE)
            .into(image1)

        Glide.with(this)
            .load(R.mipmap.pic)
            .centerCrop()
            .override(SIZE)
            .into(image2)

        Glide.with(this)
            .asBitmap()
            .load(R.mipmap.pic)
            .fitCenter()
            .addListener(object : RequestListener<Bitmap> {
                override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>, isFirstResource: Boolean): Boolean {
                    return false
                }

                override fun onResourceReady(
                    resource: Bitmap,
                    model: Any,
                    target: Target<Bitmap>?,
                    dataSource: DataSource,
                    isFirstResource: Boolean
                ): Boolean {
                    val bmp = transformToCenterCrop(resource)
                    image4.setImageBitmap(bmp)
                    return false
                }
            })
            .override(SIZE)
            .into(image3)
    }

    fun transformToCenterCrop(bitmap: Bitmap): Bitmap {
        val w = bitmap.width
        val h = bitmap.height
        val bmp = Bitmap.createBitmap(SIZE, SIZE, Bitmap.Config.ARGB_8888)
        val c = Canvas(bmp)
        c.drawColor(Color.LTGRAY)

        val mini = Math.min(w, h)
        val left = (w - mini) / 2f
        val top = (h - mini) / 2f
        val right = (w + mini) / 2f
        val bottom = (h + mini) / 2f

        val srcRectF = RectF(left, top, right, bottom)
        val dstRectF = RectF(0f, 0f, SIZE.toFloat(), SIZE.toFloat())
        val mx = Matrix()
        mx.setRectToRect(srcRectF, dstRectF, Matrix.ScaleToFit.CENTER)
        c.drawBitmap(bitmap, mx, null)

        return bmp
    }
}

转换为centerCrop耗时约1ms。

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

相关推荐
lxysbly18 小时前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者821 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码203521 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥1 天前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓1 天前
[JDBC]元数据
android
独行soc1 天前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能1 天前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿1 天前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc1 天前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20351 天前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos