【Android】Glide加载SVG,SVG转PNG
Dependency
plugins {id 'kotlin-kapt'
}dependencies {api 'com.github.bumptech.glide:glide:4.12.0'kapt 'com.github.bumptech.glide:compiler:4.12.0'api 'com.caverock:androidsvg:1.4'
}
SvgDecoder
负责解码SVG资源
import com.bumptech.glide.load.Options
import com.bumptech.glide.load.ResourceDecoder
import com.bumptech.glide.load.engine.Resource
import com.bumptech.glide.load.resource.SimpleResource
import com.bumptech.glide.request.target.Target
import com.caverock.androidsvg.SVG
import java.io.InputStreamclass SvgDecoder : ResourceDecoder<InputStream, SVG> {override fun handles(source: InputStream, options: Options): Boolean {return true}override fun decode(source: InputStream, width: Int, height: Int, options: Options): Resource<SVG> {val svg = SVG.getFromInputStream(source)if (width != Target.SIZE_ORIGINAL)svg.documentWidth = width.toFloat()if (height != Target.SIZE_ORIGINAL)svg.documentHeight = height.toFloat()return SimpleResource(svg)}
}
SvgTranscoder
负责将SVG转为Android的Drawable或Bitmap
import android.graphics.drawable.PictureDrawable
import com.bumptech.glide.load.Options
import com.bumptech.glide.load.engine.Resource
import com.bumptech.glide.load.resource.SimpleResource
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder
import com.caverock.androidsvg.SVGclass SvgTranscoder : ResourceTranscoder<SVG, PictureDrawable> {override fun transcode(toTranscode: Resource<SVG>, options: Options): Resource<PictureDrawable> {val svg = toTranscode.get()val picture = svg.renderToPicture()val drawable = PictureDrawable(picture)return SimpleResource(drawable)}
}
SvgModule
注册Glide自定义插件
import android.content.Context
import android.graphics.drawable.PictureDrawable
import com.bumptech.glide.Glide
import com.bumptech.glide.Registry
import com.bumptech.glide.annotation.GlideModule
import com.bumptech.glide.module.AppGlideModule
import com.caverock.androidsvg.SVG
import java.io.InputStream@GlideModule
class SvgModule : AppGlideModule() {override fun registerComponents(context: Context, glide: Glide, registry: Registry) {registry.register(SVG::class.java, PictureDrawable::class.java, SvgTranscoder())registry.append(InputStream::class.java, SVG::class.java, SvgDecoder())}override fun isManifestParsingEnabled(): Boolean {return false}
}
GlideApp
编译会生成一个GlideApp,用它来取代默认的Glide加载资源即可
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
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
import com.onyx.android.test.databinding.ActivityHomeBinding
import java.io.FileOutputStreamclass HomeActivity : AppCompatActivity() {lateinit var binding: ActivityHomeBindingprivate val svg = "http://xxxxxxxxxxxxx.svg"private val png = "https://xxxxxxxxxxxxx.png"override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityHomeBinding.inflate(layoutInflater)setContentView(binding.root)}override fun onResume() {super.onResume()test()}private fun test() {val image = binding.imageval listener = object : RequestListener<Drawable> {override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {return false}// write to png fileoverride fun onResourceReady(drawable: Drawable, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {val bitmap = Bitmap.createBitmap(drawable.intrinsicWidth,drawable.intrinsicHeight, Bitmap.Config.ARGB_8888)val canvas = Canvas(bitmap)drawable.setBounds(0, 0, canvas.width, canvas.height)drawable.draw(canvas)val file = "sdcard/0.png"FileOutputStream(file).use {bitmap.compress(Bitmap.CompressFormat.PNG, 100, it)}return false}}GlideApp.with(this).asDrawable().load(svg).addListener(listener).into(image)}
}相关文章:
【Android】Glide加载SVG,SVG转PNG
Dependency plugins {id kotlin-kapt }dependencies {api com.github.bumptech.glide:glide:4.12.0kapt com.github.bumptech.glide:compiler:4.12.0api com.caverock:androidsvg:1.4 }SvgDecoder 负责解码SVG资源 import com.bumptech.glide.load.Options import com.bumpte…...
Spring、SpringMVC、Springboot三者的区别和联系
1.背景 最近有人问面试的一个问题:Spring、SpringMVC、Springboot三者的区别和联系,个人觉得:万变不离其宗,只需要理解其原理,回答问题信手拈来。 2.三者区别和联系 2.1 先了解Spring基础 Spring 框架就像一个家族…...
一点点安全资料:网络安全扩展
协议扩展 加密协议SSL/TLS 简介 SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是加密协议,设计用来提供网络通信的安全性和数据完整性。尽管TLS是SSL的后继者,但两者的核心目标相同&#x…...
vscode的源码插件GitHub Repositories
打铁还需自身硬,需要不断提升自我,提升自我的一种方式就是看源码,站在更高的维度去理解底层原理,以便以后更好的开发和解决问题,由于源码一个动不动就是几个G甚至十几个G,如果一个个源码下载下来࿰…...
如何定义快速开发平台框架?有何突出优势?
作为提质增效的利器软件,快速开发平台框架如何能在众多同行中取胜?又是凭借什么优势特点在激烈的市场竞争中获得众多客户的青睐与信任?不管是从企业角度、服务商角度,还是使用者的角度来说,做好流程化进程,…...
二分练习题——奶牛晒衣服
奶牛晒衣服 题目分析 这里出现了“弄干所有衣服的最小时间”,那么可以考虑用二分去做。 第一阶段二段性分析 假设当前需要耗费的时间为mid分钟,如果mid分钟内可以烘干这些衣服,那么我们可以确定右边界大于mid的区间一定也可以。但是此时我…...
python工具包【1】 -- 不同操作系统路径转换
python工具包【1】 – 不同操作系统路径转换 以下的工具类的作用是根据不同的操作系统,将代码中的路径转换成适应操作系统的路径。 代码 import osclass Base_Tools_Cls:def BasePathConvert_func(self, path):根据不同的操作系统,将路径进行转换为不…...
JAVA中@FunctionalInterface 注解使用
FunctionalInterface是Java 8引入的一个注解,用于标记一个接口为函数式接口。函数式接口是指只有一个抽象方法(除了Object类中的默认方法如equals、hashCode等)的接口。在Java 8及以后版本中,函数式接口可以与lambda表达式配合使用…...
【Spring Cloud Alibaba】9 - OpenFeign集成Sentinel实现服务降级
目录 一、简介Sentinel 是什么如何引入Sentinel 二、服务搭建1.安装Sentinel控制台1.1 下载1.2 启动1.3 访问 2.改造服务提供者cloud-provider服务2.1 引入依赖2.2 添加API2.3 添加配置文件 3.改造cloud-consumer-feign服务3.1 引入依赖3.2 添加Feign接口3.3 添加服务降级类3.4…...
Chrome浏览器如何跟踪新开标签的网络请求?
在测试一个东西的时候,它虽然是a链接,但是,是由前端在js里写跳转的。我又必须要知道它的跳转链接,只能用截屏的方式来捕捉浏览器的地址栏链接 打开浏览器控制台(F12)点击红色箭头打钩为弹出式窗口自动打开DevTools 英文版调试参…...
html写一个登录注册页面
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册登录界面Ⅰ</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.mi…...
Stable Diffusion|Ai赋能电商 Inpaint Anything
1. 背景介绍 随着人工智能技术的不断发展,其在电商领域的应用也越来越广泛。其中,图像修复技术在电商领域有着重要的应用价值。例如,在商品图片处理中,去除图片中的水印、瑕疵等,可以提高商品图片的质量和美观度。 2…...
启明智显M系列--工业级HMI芯片选型表
本章主要介绍启明智显M系列HMI主控芯片: 纯国产自主, RISC-V 内核,配备强大的 2D 图形加速处理器、PNG/JPEG 解码引擎、H.264解码;工业宽温,提供全开源SDK;1秒快速开机启动的特性,极大地提高了…...
C语言面试题之最小高度树
最小高度树 实例要求 1、给定一个有序整数数组,元素各不相同且按升序排列;2、编写一个算法,创建一棵高度最小的二叉搜索树;示例: 给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它…...
【随笔】Git 高级篇 -- 整理提交记录(上)cherry-pick(十五)
💌 所属专栏:【Git】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…...
上门服务小程序|上门服务系统|上门服务软件开发流程
在如今快节奏的生活中,上门服务小程序的需求越来越多。它们向用户提供了方便、高效的服务方式,解决了传统服务行业中的很多痛点。如果你也想开发一个上门服务小程序,以下是开发流程和需要注意的事项。 1、确定需求:在开始开发之前…...
Vuex(vue 项目中实现 频繁、大范围数据共享的技术方案)
参考文档(点击查看) 好处 1.数据的存取一步到位,不需层层传递 2.数据的流动非常清晰 3.存储在Vuex中的数据都是响应式的(数据更新后,使用数据的组件都会自动更新) Vuex基础配置 npm i vuex3.6.2state中用来存储数据,…...
【Spring Cloud】服务容错中间件Sentinel入门
文章目录 什么是 SentinelSentinel 具有以下特征:Sentinel分为两个部分: 安装 Sentinel 控制台下载jar包,解压到文件夹启动控制台访问了解控制台的使用原理 微服务集成 Sentinel添加依赖增加配置测试用例编写启动程序 实现接口限流总结 欢迎来到阿Q社区 …...
算法刷题记录 Day36
算法刷题记录 Day36 Date: 2024.04.02 lc 416. 分割等和子集 //2. 一维数组 class Solution { public:bool canPartition(vector<int>& nums) {// 将问题转化为从数组中任意取数,使得容量为数组总和一半的背包内的价值尽可能大。// dp[j]表示容积为j的…...
面试必问 - CSS 中元素居中小技巧
在网页设计中,居中是一个至关重要的布局技巧,能够确保你的页面在不同设备和屏幕尺寸上呈现出优雅的样式。 在这篇文章中,将介绍一些 CSS 居中的基本技巧,适用于各种场景。 1. 水平居中 文本水平居中 通过设置 text-align: cen…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...
数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...
