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

news/2025/1/11 23:51:41 标签: android, SVG

引入依赖:

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 文件为 Document
    val 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")
	// 显示修改后的 SVG
	svgImageView.setSVG(svg)
}

布局文件:

	<com.caverock.androidsvg.SVGImageView
        android: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.niftyadmin.cn/n/5820403.html

相关文章

PyCharm 的安装与使用(Window)

1 PyCharm 简介 PyCharm 是一款由 JetBrains 公司开发的专门用于 Python 语言开发的集成开发环境&#xff08;IDE&#xff09;。以下是其相关介绍&#xff1a; 1.1 特点与功能 智能代码编辑&#xff1a;提供高度智能化的代码编辑器&#xff0c;支持语法高亮、自动补全、代码重…

基于springboot的甘肃非物质文化网站设计与实现源码(java+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的甘肃非物质文化网站设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 甘肃非物质…

idea下java的maven项目编译内存溢出GC overhead limit exceeded解决办法

在编译阶段出现“GC overhead limit exceeded”错误&#xff0c;通常与编译器本身的内存使用有关&#xff0c;而不是项目的运行时问题。这种情况常见于大型项目或复杂的编译设置。以下是一些具体的调整建议&#xff0c;帮助你在编译阶段解决内存问题&#xff1a; 1. 增加Java编…

案例研究:UML用例图中的结账系统

在软件工程和系统分析中&#xff0c;统一建模语言&#xff08;UML&#xff09;用例图是一种强有力的工具&#xff0c;用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究&#xff0c;详细解释UML用例图的关键概念&#xff0c;并说明其在设计结账系统中的应用。 用…

六、Angular 发送请求/ HttpClient 模块

一、应用 HttpClient 模块 angular/common/http 中的 HttpClient 类基于浏览器提供的 XMLHttpRequest 接口。要想使用 HtpClient 模块&#xff0c;就要先导入 Anqular 的 HttpClientModule。大多数 Web 应用程序都会在根模块 AppModule 中导入它。 编辑 src/app/app.module.ts…

ElasticSearch 认识和安装ES

文章目录 一、为什么学ElasticSearch?1.ElasticSearch 简介2.ElasticSearch 与传统数据库的对比3.ElasticSearch 应用场景4.ElasticSearch 技术特点5.ElasticSearch 市场表现6.ElasticSearch 的发展 二、认识和安装ES1.认识 Elasticsearch&#xff08;简称 ES&#xff09;2.El…

Golang中的锁机制

在Go语言中&#xff0c;处理并发问题时通常优先考虑使用信道&#xff08;channel&#xff09;&#xff0c;但在某些情况下&#xff0c;当信道无法解决问题时&#xff0c;就需要使用锁机制来处理共享内存的并发访问。Go语言提供了两种主要的锁类型&#xff1a;互斥锁&#xff08…

AI在软件工程教育中的应用与前景展望

引言 随着科技的快速发展&#xff0c;软件工程教育面临着前所未有的挑战与机遇。传统的教学模式逐渐无法满足快速变化的行业需求&#xff0c;学生们需要更多的实践经验和个性化的学习方式。而在这样的背景下&#xff0c;人工智能&#xff08;AI&#xff09;作为一项创新技术&a…