在 Android 中 Matrix 实现图像的缩放和裁剪将 Glide 图像从 fitCenter 转换为 centerCrop

在 Android 中,Matrix 可以用来实现图像的缩放和裁剪逻辑。要将 Glide 图像从 fitCenter 转换为 centerCrop,需要通过 Matrix 计算变换逻辑。
以下是使用 Kotlin 实现的方法:
实现步骤
计算目标变换矩阵:根据目标宽高比,判断是否需要横向或纵向裁剪。
设置 Matrix:使用 Matrix 执行缩放和平移操作。
应用到 Glide:自定义一个 Glide 的 Transformation 类。
以下是完整的代码实现:

import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.Paint
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import java.security.MessageDigest

class FitCenterToCenterCropTransformation : BitmapTransformation() {
    override fun updateDiskCacheKey(messageDigest: MessageDigest) {
        messageDigest.update("fit_center_to_center_crop".toByteArray(Charsets.UTF_8))
    }

    override fun transform(
        pool: BitmapPool,
        toTransform: Bitmap,
        outWidth: Int,
        outHeight: Int
    ): Bitmap {
        val srcWidth = toTransform.width.toFloat()
        val srcHeight = toTransform.height.toFloat()
        val targetWidth = outWidth.toFloat()
        val targetHeight = outHeight.toFloat()

        val matrix = Matrix()

        // Calculate the scale
        val scale: Float
        val dx: Float
        val dy: Float

        if (srcWidth / srcHeight > targetWidth / targetHeight) {
            // Wider image, fit height and crop width
            scale = targetHeight / srcHeight
            dx = (targetWidth - srcWidth * scale) / 2
            dy = 0f
        } else {
            // Taller image, fit width and crop height
            scale = targetWidth / srcWidth
            dx = 0f
            dy = (targetHeight - srcHeight * scale) / 2
        }

        // Apply scale and translation
        matrix.setScale(scale, scale)
        matrix.postTranslate(dx, dy)

        // Create the transformed bitmap
        val transformedBitmap = pool.get(outWidth, outHeight, toTransform.config ?: Bitmap.Config.ARGB_8888)
        val canvas = Canvas(transformedBitmap)
        val paint = Paint(Paint.FILTER_BITMAP_FLAG)
        canvas.drawBitmap(toTransform, matrix, paint)

        return transformedBitmap
    }
}

使用方法
将自定义的 Transformation 应用到 Glide:

Glide.with(context)
    .load(imageUrl)
    .transform(FitCenterToCenterCropTransformation())
    .into(imageView)

解释
Matrix 的作用:通过 Matrix 调整图像的缩放和位置。
兼容性处理BitmapConfig 可能为空,所以在新建位图时要默认使用 ARGB_8888
Glide 的缓存updateDiskCacheKey 用于区分不同的变换操作,避免缓存冲突。
效果
该代码会将原本 fitCenter(全图适配但留黑边)的图片按比例裁剪,转换成 centerCrop(以中间为基准裁剪并充满视图)。

发布者:myrgd,转载请注明出处:https://www.object-c.cn/5067

Like (0)
Previous 2024年12月3日 下午12:23
Next 2024年12月3日 下午1:11

相关推荐

  • 使用Docker搭建Deepl开源翻译组件使用教程

    DeepL 是一个优秀的翻译工具,目前官方并未提供直接的开源版本或本地部署方案。不过,社区中存在一些基于 DeepL API 的开源项目,可以通过 Docker 搭建一个翻译服务接口。以下是使用 Docker 搭建 DeepL 翻译组件的详解。 一、准备工作 二、开源项目选择 1. 使用社区项目封装的 DeepL API 服务 社区中有一些开源项目,基于 D…

    2024年11月23日
    00
  • 最新 pragma solidity 0 . 5 . 10 报错原因解决

    pragma solidity 0.5.10 会报错的原因通常与当前使用的 Solidity 编译器版本不支持该指定版本的语法有关。要解决此问题,需要确保使用正确的编译器版本或调整代码中的版本声明。 问题分析指定的版本过旧: Solidity 0.5.10 是较旧的版本,而现代的工具链(如 Truffle 或 Hardhat)可能默认安装更新版本的编译器。不…

    2024年11月27日
    00
  • 塞风加速器下载安装教程页(页脚安装包)

    Ps iphon 是一款用于绕过互联网审查和访问被封锁网站的免费工具。它通过 VPN、SSH 或 HTTP 代理技术实现翻墙功能。以下是 Ps iphon 在不同平台上的安装教程。 Ps iphon 安装教程 1. 在 Android 上安装 Ps iphon 2. 在 Windows 上安装 Ps iphon 3. 在 iOS 上安装 Psiphon iO…

    2024年12月27日
    00
  • 实现“鼠标点击器外挂”,模拟快速点击或者自动化点击的工具

    实现一个“鼠标点击器外挂”,通常是指模拟快速点击或者自动化点击的工具。以下是一个实现的基本思路和代码示例,适合用于演示或学习目的。 功能描述自动模拟鼠标点击(单击或双击)。用户可以设置点击间隔和总点击次数。提供启动和停止按钮,方便控制。 示例实现HTML CSS (style.css) JavaScript (script.js) 功能实现说明用户输入:用户…

    2024年11月30日
    00
  • Android Studio 国内镜像,加速下载和构建过程

    在国内使用 Android Studio 时,由于访问 Google 的官方资源(如 Gradle 和 SDK)速度较慢甚至无法访问,可以通过配置国内镜像源来加速下载和构建过程。以下是详细配置步骤: 1. 配置 Gradle 国内镜像 Gradle 是 Android Studio 构建项目的重要工具,其依赖库通常托管在 Google Maven 和 JCe…

    2024年11月25日
    00
  • 在 Neo4j 中存储 Liquidity Structure(的层次和关联结构)

    在 Neo4j 中存储 Liquidity Structure(流动性结构)的层次和关联结构时,可以使用其图数据库的特性:节点(Node)表示实体,关系(Relationship)表示这些实体之间的连接。流动性结构通常涉及多层次的实体(如母公司、子公司、账户、资金池等)及其关联关系。 以下是具体实现步骤: 1. 设计数据模型节点类型:实体层次(Hierarc…

    2024年12月2日
    00
  • 微信小程序使用 map 组件实现拖动地图并获取当前地图中心的经纬度

    在微信小程序中,使用 map 组件可以轻松实现拖动地图并获取当前地图中心的经纬度。以下是实现步骤和代码示例: 实现思路 代码实现 1. 页面 WXML 添加 map 组件并设置属性。 2. 页面 WXSS 定义地图样式和中心点标记样式。 3. 页面 JS 初始化地图中心点的经纬度,并监听地图拖动。 4. 中心点图标 将一个中心标记图标放置在地图中间。可以在小…

    2024年11月25日
    00
  • 使用 Webpack 5 优化构建减少生成文件的体积提升前端性能

    在使用 Webpack 5 时,优化构建以减少生成文件的体积是提升前端性能的重要一步。以下是一些常见的优化方法和策略: 1. 开启生产模式 确保构建时使用生产模式,Webpack 会自动应用多种优化(如代码压缩、Tree Shaking 等): 或在配置文件中明确设置: 2. 启用 Tree Shaking Tree Shaking 是 Webpack 内置…

    2024年12月3日
    00
  • Redis中如何使用lua脚本redis与lua的相互调用方法

    在 Redis 中,Lua 脚本 提供了一种强大的方式来执行原子操作,可以在 Redis 服务器上直接执行 Lua 代码,从而避免了多次网络往返和保证操作的原子性。Redis 内置了对 Lua 脚本的支持,通过 EVAL 命令来执行脚本,EVALSHA 则用于执行已经加载到 Redis 服务器的脚本。1. Redis 与 Lua 脚本的基本交互1.1 基本的…

    2024年11月28日
    00
  • 如何用pbootcmsAPI接口开发微信小程序UNIAPP

    使用 PbootCMS 的 API 接口结合 UniApp 开发微信小程序,可以实现高效的内容管理和展示。以下是一个完整的开发流程,包括 API 接口设置、小程序功能设计和开发细节。 1. 准备工作1.1 配置 PbootCMS API 接口PbootCMS 提供 API 功能,需在后台开启并配置:登录 PbootCMS 后台管理。前往 系统管理 -> AP…

    2024年11月28日
    00
  • 解决 Vue 3 应用部署到 GitHub Pages 后,遇到 404 错误问题

    在将 Vue 3 应用部署到 GitHub Pages 后,遇到 404 错误通常是由于 GitHub Pages 处理路由时的问题。Vue 3 使用 Vue Router 来管理前端路由,而 GitHub Pages 本身是静态托管服务,不支持处理 SPA(单页面应用)的客户端路由。因此,当你直接访问某个页面 URL(比如 https://youruser…

    2024年11月29日
    00
  • 微信小程序设计和实现一个校园音乐应用的方法

    基于微信小程序设计和实现一个校园音乐平台,主要包括以下几个方面的设计与功能实现: 1. 需求分析 1.1 功能需求 1.2 非功能需求 2. 技术架构设计 2.1 前端:微信小程序 2.2 后端 2.3 技术栈 3. 数据库设计 表结构示例: 4. 功能实现 4.1 用户登录与注册 4.2 音乐播放 4.3 歌单与榜单 4.4 评论功能 5. 部署与优化 5…

    2024年11月26日
    00
  • 远程仓库 ,从GitHub拉取代码失败的解决办法

    从GitHub拉取代码失败通常由以下几种原因引起:网络问题、认证失败、远程仓库配置错误等。以下是常见的失败场景及解决办法。 1. 网络问题症状连接超时。报错如:fatal: unable to access ‘https://github.com/…’: Failed to connect to github.com port 443: Connecti…

    2024年11月28日
    00
  • Flutter 在 PC 端多窗口支持方面的进展备受关注的功能,已在 Ubuntu/Canonical 展示

    Flutter 在 PC 端多窗口支持方面的进展是一个备受关注的功能,它的目标是进一步提升 Flutter 的跨平台能力。最近,Flutter 团队与 Canonical 合作,在 Ubuntu 平台上展示了多窗口功能的新成果。这一进展对开发者和终端用户来说都有重要意义,以下是相关细节分析: 展示细节多窗口功能亮相Flutter 的多窗口支持在 Ubuntu…

    2024年12月2日
    00
  • 使用 VS Code 管理 Git 仓库详细使用指南

    使用 VS Code 管理 Git 仓库,可以通过其直观的图形界面和终端功能完成常见的版本控制操作,如克隆、提交、分支管理等。以下是一个详细的使用指南,帮助你高效地使用 VS Code 和 Git。 1. 环境准备安装必要工具安装 Git:从 Git 官网 下载并安装。安装 VS Code:从 VS Code 官网 下载并安装。安装 Git 插件(可选):在…

    2024年11月30日
    00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信