当前位置: 首页 > news >正文

【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.背景 最近有人问面试的一个问题&#xff1a;Spring、SpringMVC、Springboot三者的区别和联系&#xff0c;个人觉得&#xff1a;万变不离其宗&#xff0c;只需要理解其原理&#xff0c;回答问题信手拈来。 2.三者区别和联系 2.1 先了解Spring基础 Spring 框架就像一个家族…...

一点点安全资料:网络安全扩展

协议扩展 加密协议SSL/TLS 简介 SSL&#xff08;Secure Sockets Layer&#xff09;和TLS&#xff08;Transport Layer Security&#xff09;是加密协议&#xff0c;设计用来提供网络通信的安全性和数据完整性。尽管TLS是SSL的后继者&#xff0c;但两者的核心目标相同&#x…...

vscode的源码插件GitHub Repositories

打铁还需自身硬&#xff0c;需要不断提升自我&#xff0c;提升自我的一种方式就是看源码&#xff0c;站在更高的维度去理解底层原理&#xff0c;以便以后更好的开发和解决问题&#xff0c;由于源码一个动不动就是几个G甚至十几个G&#xff0c;如果一个个源码下载下来&#xff0…...

如何定义快速开发平台框架?有何突出优势?

作为提质增效的利器软件&#xff0c;快速开发平台框架如何能在众多同行中取胜&#xff1f;又是凭借什么优势特点在激烈的市场竞争中获得众多客户的青睐与信任&#xff1f;不管是从企业角度、服务商角度&#xff0c;还是使用者的角度来说&#xff0c;做好流程化进程&#xff0c;…...

二分练习题——奶牛晒衣服

奶牛晒衣服 题目分析 这里出现了“弄干所有衣服的最小时间”&#xff0c;那么可以考虑用二分去做。 第一阶段二段性分析 假设当前需要耗费的时间为mid分钟&#xff0c;如果mid分钟内可以烘干这些衣服&#xff0c;那么我们可以确定右边界大于mid的区间一定也可以。但是此时我…...

python工具包【1】 -- 不同操作系统路径转换

python工具包【1】 – 不同操作系统路径转换 以下的工具类的作用是根据不同的操作系统&#xff0c;将代码中的路径转换成适应操作系统的路径。 代码 import osclass Base_Tools_Cls:def BasePathConvert_func(self, path):根据不同的操作系统&#xff0c;将路径进行转换为不…...

JAVA中@FunctionalInterface 注解使用

FunctionalInterface是Java 8引入的一个注解&#xff0c;用于标记一个接口为函数式接口。函数式接口是指只有一个抽象方法&#xff08;除了Object类中的默认方法如equals、hashCode等&#xff09;的接口。在Java 8及以后版本中&#xff0c;函数式接口可以与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浏览器如何跟踪新开标签的网络请求?

在测试一个东西的时候&#xff0c;它虽然是a链接&#xff0c;但是&#xff0c;是由前端在js里写跳转的。我又必须要知道它的跳转链接&#xff0c;只能用截屏的方式来捕捉浏览器的地址栏链接 打开浏览器控制台(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. 背景介绍 随着人工智能技术的不断发展&#xff0c;其在电商领域的应用也越来越广泛。其中&#xff0c;图像修复技术在电商领域有着重要的应用价值。例如&#xff0c;在商品图片处理中&#xff0c;去除图片中的水印、瑕疵等&#xff0c;可以提高商品图片的质量和美观度。 2…...

启明智显M系列--工业级HMI芯片选型表

本章主要介绍启明智显M系列HMI主控芯片&#xff1a; 纯国产自主&#xff0c; RISC-V 内核&#xff0c;配备强大的 2D 图形加速处理器、PNG/JPEG 解码引擎、H.264解码&#xff1b;工业宽温&#xff0c;提供全开源SDK&#xff1b;1秒快速开机启动的特性&#xff0c;极大地提高了…...

C语言面试题之最小高度树

最小高度树 实例要求 1、给定一个有序整数数组&#xff0c;元素各不相同且按升序排列&#xff1b;2、编写一个算法&#xff0c;创建一棵高度最小的二叉搜索树&#xff1b;示例: 给定有序数组: [-10,-3,0,5,9],一个可能的答案是&#xff1a;[0,-3,9,-10,null,5]&#xff0c;它…...

【随笔】Git 高级篇 -- 整理提交记录(上)cherry-pick(十五)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…...

上门服务小程序|上门服务系统|上门服务软件开发流程

在如今快节奏的生活中&#xff0c;上门服务小程序的需求越来越多。它们向用户提供了方便、高效的服务方式&#xff0c;解决了传统服务行业中的很多痛点。如果你也想开发一个上门服务小程序&#xff0c;以下是开发流程和需要注意的事项。 1、确定需求&#xff1a;在开始开发之前…...

Vuex(vue 项目中实现 频繁、大范围数据共享的技术方案)

参考文档(点击查看) 好处 1.数据的存取一步到位&#xff0c;不需层层传递 2.数据的流动非常清晰 3.存储在Vuex中的数据都是响应式的&#xff08;数据更新后&#xff0c;使用数据的组件都会自动更新&#xff09; Vuex基础配置 npm i vuex3.6.2state中用来存储数据&#xff0c…...

【Spring Cloud】服务容错中间件Sentinel入门

文章目录 什么是 SentinelSentinel 具有以下特征&#xff1a;Sentinel分为两个部分: 安装 Sentinel 控制台下载jar包&#xff0c;解压到文件夹启动控制台访问了解控制台的使用原理 微服务集成 Sentinel添加依赖增加配置测试用例编写启动程序 实现接口限流总结 欢迎来到阿Q社区 …...

算法刷题记录 Day36

算法刷题记录 Day36 Date: 2024.04.02 lc 416. 分割等和子集 //2. 一维数组 class Solution { public:bool canPartition(vector<int>& nums) {// 将问题转化为从数组中任意取数&#xff0c;使得容量为数组总和一半的背包内的价值尽可能大。// dp[j]表示容积为j的…...

面试必问 - CSS 中元素居中小技巧

在网页设计中&#xff0c;居中是一个至关重要的布局技巧&#xff0c;能够确保你的页面在不同设备和屏幕尺寸上呈现出优雅的样式。 在这篇文章中&#xff0c;将介绍一些 CSS 居中的基本技巧&#xff0c;适用于各种场景。 1. 水平居中 文本水平居中 通过设置 text-align: cen…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...