Android 修改SVG属性并显示图片(AndroidSvg)

引入依赖:

dependencies {implementation 'com.caverock:androidsvg-aar:1.4'
}

核心代码:

import com.caverock.androidsvg.SVG
import org.w3c.dom.Document
import java.io.StringWriter
import javax.xml.transform.OutputKeys
import javax.xml.transform.TransformerFactory
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult
import java.io.InputStream
import javax.xml.parsers.DocumentBuilderFactory/*** 打开svg文件并设置(修改)某个属性*/
fun openSvgAndSetAttribute(svgInputStream: InputStream,elementId: String,attrName: String,value: String
): SVG {// 解析 SVG 文件为 Documentval document: Document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(svgInputStream)// 修改某个元素,例如更改颜色val element = document.getElementById(elementId)element?.setAttribute(attrName, value) // 将填充色修改为红色val s = documentToString(document)return SVG.getFromString(s)
}/*** 将 Document 转换为字符串*/
private fun documentToString(document: Document): String {val transformer = TransformerFactory.newInstance().newTransformer()//设置是否省略 XML 声明。OMIT_XML_DECLARATION这是一个常量,表示是否在输出的 XML 文件顶部包含 XML 声明(例如 <?xml version="1.0" encoding="UTF-8"?>)。transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes")//设置是否在生成的 XML 中启用缩进格式。transformer.setOutputProperty(OutputKeys.INDENT, "yes")val writer = StringWriter()transformer.transform(DOMSource(document), StreamResult(writer))return writer.toString()
}

使用方法:

override fun onCreate(savedInstanceState: Bundle?) {//代码省略...val svgImageView = findViewById<SVGImageView>(R.id.svg_image_view)val svg = openSvgAndSetAttribute(assets.open("example.svg"),"exampleCircle","fill","#00ff00")// 显示修改后的 SVGsvgImageView.setSVG(svg)
}

布局文件:

	<com.caverock.androidsvg.SVGImageViewandroid:id="@+id/svg_image_view"android:layout_width="400dp"android:layout_height="300dp"/>

example.svg 示例:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200" viewBox="0 0 200 200"><!-- 定义一个矩形 --><rect x="10" y="10" width="180" height="180" fill="#87CEEB" stroke="#000" stroke-width="2" /><!-- 定义一个圆形 --><circle id="exampleCircle" cx="100" cy="100" r="50" fill="#FF6347" stroke="#000" stroke-width="2" /><!-- 定义一条直线 --><line x1="50" y1="150" x2="150" y2="50" stroke="#000" stroke-width="2" /><!-- 添加文本 --><text x="50" y="190" font-family="Arial" font-size="14" fill="#000">这是一个示例 SVG</text>
</svg>

如果启用了混淆,需要在 proguard-rules.pro 中添加:

-keep class javax.xml.** { *; }
-keep class org.w3c.dom.** { *; }
-keep class org.xml.sax.** { *; }

假如直接使用如下方式操作元素属性:

// 获取SVG的根元素
val svgRoot = svg.getRootElement()// 可以进一步操作SVG元素,例如设置宽高等属性
svgRoot.setDocumentWidth("100%")
svgRoot.setDocumentHeight("100%")

则会提示:

Cannot access 'getRootElement': it is package-private in 'SVG'

官网地址:https://bigbadaboom.github.io/androidsvg/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/892603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务器查看【可用端口号连接】的命令和方式【netstat,ss,lsof】

Linux服务器查看可用连接的端口号的命令和方式 前言&#xff1a;1. 使用netstat命令&#xff08;netstat命令详解及使用指南&#xff09;一、什么是netstat二、基本使用方法与参数解释三、输出结果字段含义&#xff1a;四、查找可用于SSH连接的端口示例五、部分高级用法&#x…

云集电商:数据库的分布式升级实践|OceanBase案例

电商行业对数据库有哪些需求 云集电商作为一家传统电商企业&#xff0c;业务涵盖了美妆个护、服饰、水果生鲜、健康保健等多个领域&#xff0c;在创立四年后在纳斯达克上市&#xff08;股票代码&#xff1a;YJ&#xff09;。与京东、淘宝、拼多多等电商平台不同&#xff0c;云…

Vue.js 事件绑定:v-on 和 @

Vue.js 事件绑定&#xff1a;v-on 和 今天我们来聊聊 Vue.js 中一个超常用的功能——事件绑定。只需要写几行代码&#xff0c;你就能轻松让页面和用户的交互灵动起来。Vue 提供了一个指令叫 v-on&#xff0c;还有它的简写形式 &#xff0c;两者都可以用来绑定事件。 什么是事…

智能租赁系统提升效率与服务质量的全新解决方案

内容概要 智能租赁系统的崛起就像一场春雨&#xff0c;滋润着租赁行业的每一个角落。它通过先进的技术架构&#xff0c;结合数据管理&#xff0c;优化了以往繁琐的租赁流程&#xff0c;让整个过程如同顺畅的流水。比如&#xff0c;通过智能算法自动计算费用&#xff0c;使得用…

ClickHouse大数据准实时更新

一、问题背景 最近有一个项目需求&#xff0c;需要对日活跃的3万辆车的定位数据进行分析&#xff0c;并支持查询和统计分析结果。每辆车每天产生1条分析结果数据&#xff0c;要求能够查询过去一年内的所有分析结果。因此&#xff0c;每月需要处理约90万条记录&#xff0c;一年大…

苹果手机(IOS系统)出现安全延迟进行中如何关闭?

苹果手机&#xff08;IOS系统&#xff09;出现安全延迟进行中如何关闭&#xff1f; 一、设置二、隐私与安全性三、失窃设备保护关闭 一、设置 二、隐私与安全性 三、失窃设备保护关闭

VxWorks [安装workbench之修改虚拟机Mac]

问题&#xff1a; 一、安装VMware 下载链接 [VMware 15 pro](https://segmentfault.com/a/1190000022562275)二、修改VMnet1的Mac ** 打开注册表 ** ctrl f 搜索VMnet1 增加字符串值 NetWorkAddress 00D6196C32 三、重启VMnet1 修改完成 四、重启 workbench

Redis十大数据类型详解

Redis&#xff08;一&#xff09; 十大数据类型 redis字符串&#xff08;String&#xff09; string是redis最基本的类型&#xff0c;一个key对应一个value string类型是二进制安全的&#xff0c;意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象 一个re…

Mysql tinyint与Java的数据类型的对应关系

参考资料 理解误区——mysql中tinyint与Java的数据类型的对应关系&#xff1b;tinyint(1) 与tinyint(4)的区别 1.1 tinyint字段取值 数据库字段类型为 tinyint,值为0或1,直接通过SQL语句查询的话,0会取出false;1会取出true目前就想取出的结果为 0 或 1 selectpg_id ,pg_name…

【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)

StyleGAN2 是英伟达团队 NVIDIA 提出的生成对抗网络&#xff08;GAN&#xff09;的一种改进版本。 它通过创新的网络架构&#xff0c;能够生成细节丰富、逼真的图像&#xff0c;特别在高频细节&#xff08;如皮肤纹理、光照等&#xff09;的表现上表现卓越。与传统 GAN 相比&am…

【三维数域】三维数据调度-负载均衡和资源优化

在处理大规模三维数据时&#xff0c;负载均衡和资源优化是确保系统高效运行、提供流畅用户体验的关键。这两者不仅影响到系统的性能和稳定性&#xff0c;还直接决定了用户交互的质量。以下是关于如何在三维数据调度中实现有效的负载均衡和资源优化的详细探讨。 一、负载均衡 负…

成功案例分享 — 芯科科技助力涂鸦智能打造Matter over Thread模块,简化Matter设备开发

芯科科技&#xff08;Silicon Labs&#xff09;的愿景之一是让开发者每天都能够更轻松地开发无线物联网&#xff08;IoT&#xff09;。特别是在拥有相同愿景的合作伙伴的帮助下&#xff0c;我们每天都在取得进步。但是要想弥合知识水平和物联网开发之间的差距仍会面临一定的挑战…

如何将 sqlserver 数据迁移到 mysql

文章目录 前言一、导出SQL Server 数据二、转换数据格式为MySQL兼容格式三、导入数据到MySQL数据库五、使用ETL工具六、通过 navicat 工具七、总结 前言 将 SQL Server 数据迁移到 MySQL 是一个常见的数据库迁移任务&#xff0c;通常涉及以下几个关键步骤&#xff1a;导出 SQL…

10Hive性能优化

10Hive性能优化 1Hive性能问题排查的方式1.1Hive底层原理&#xff1a;explain执行计划详解1.1.1 explain理论1.1.2 实践 2Hive性能调优的方式2.1. SQL语句优化1. union all2. distinct 2.2. 数据格式优化2.3. 小文件过多优化2.3.1解决hive小文件过多问题小文件产生的原因小文件…

安全规约、脱敏规范、敏感逻辑的保护方案、防止 SQL 注入

文章目录 I 强制性安全规约平台资源的防重放机制URL 外部重定向传入的目标地址必须执行白名单过滤。表单、AJAX 提交必须执行 CSRF 安全验证。禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。用户请求参数必须做有效性验证防止 SQL 注入用户敏感数据用户权限控制校验…

vscode 切换文件时,修改内容时很卡,怎么解决?

VSCode 切换文件或修改内容时卡顿&#xff0c;可能由以下原因引起&#xff0c;以下是一些解决方法&#xff1a; 1. 插件问题 排查&#xff1a; 禁用所有扩展&#xff08;使用命令面板 CtrlShiftP -> 输入 Disable All Installed Extensions&#xff09;。逐个启用扩展&…

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …

3.Qt Quick-QML地图引擎之v4.3版本(新增动态轨迹线/海图/天地图街道/天地图卫星)

在上个版本Qt Quick-QML地图引擎之v4版本(新增多模型切换/3D模型欧拉角模拟)_qt加载3d地图-CSDN博客更新了3D模拟功能&#xff0c;在4.3版本增加动态轨迹线、三个地图(海图/天地图街道/天地图卫星)。 4.3版本已经支持qt6 cmake版本&#xff0c;而4.3版本以下支持qt5版本&#x…

数据结构:DisjointSet

Disjoint Sets意思是一系列没有重复元素的集合。一种常见的实现叫做&#xff0c;Disjoint-set Forest可以以接近常数的时间复杂度查询元素所属集合&#xff0c;用来确定两个元素是否同属一个集合等&#xff0c;是效率最高的常见数据结构之一。 Wiki链接&#xff1a;https://en…

c++ 17 constexpr

未来已来&#xff1a;从SFINAE到concepts #include <type_traits> #include <vector> #include <list> #include <iostream> // 一个通用的容器打印函数&#xff0c;支持任何带 begin()/end() 的容器 template<typename Container> …