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

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 文件为 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.kler.cn/a/500350.html

相关文章:

  • Android 网络层相关介绍
  • 关于物联网的基础知识(二)——物联网体系结构分层
  • Android基于回调的事件处理
  • Flink概念知识讲解之:Restart重启策略配置
  • 【Notepad++】Notepad++如何删除包含某个字符串所在的行
  • 可视化-Visualization
  • Spring Security单点登录
  • linux-ssh + google authenticator双因子认证
  • Python 通过命令行在 unittest.TestCase 中运行单元测试
  • 妙用编辑器:把EverEdit打造成一个编程学习小环境
  • 通过案例研究二项分布和泊松分布之间关系
  • Windows下安装最新版的OpenSSL,并解决OpenSSL不是当前版本的问题,或者安装不正确的问题
  • Python爬虫进阶——案例:模拟bilibili登录)
  • 【Elasticsearch】 复合查询
  • 贪心算法汇总
  • NLP文本数据增强全攻略:从回译到多样化策略,全面提升模型表现!
  • 8 事件等待
  • Windows下调试Dify相关组件(1)--前端Web
  • 2024版idea 插件无法加载
  • C#中通道(Channels)的应用之(生产者-消费者模式)
  • 微商关系维系与服务创新:链动2+1模式、AI智能名片与S2B2C商城小程序的应用研究
  • AI刷题-数列推进计算任务、数组中的幸运数问题
  • 【复习小结】1-13
  • [ Spring ] Install MongoDB on Ubuntu24
  • windows及linux 安装 Yarn 4.x 版本
  • 记录一个在增量更新工具类