Android动态修改svg的属性

1,137 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

使用背景

在有些场景下,我们需要将svg的上面的属性动态修改,就比如有些场景下要从后台获取一些数据,然后动态改变到svg上。在有些电力图(svg格式)上我们要获取实时数据,然后要将上面的数据改变进行渲染。

修改的逻辑

首先我们将svg图片放到安卓项目中的assets文件夹中,在内存中进行改变,然后将数据保存到手机存储中,svg格式可以看做是一个dom节点的树状结构,近来我们就可以在安卓中进行解析这个svg格式文件,然后获取到想要修改的节点,进行改变它的属性。

开始修改coding

将svg格式的文件放到assets文件中,我们使用DocumentBuilderFactory进行加载然后将文件进行读取输入流,然后DocumentBuilder然后svg文件转换成Document文档,进行dom解析。我们要将svg图片的某个颜色值进行修改如下图所示,将图片的口罩颜色更改为白色。

image.png

image.png

我们首先要知道要修改的地方,在什么位置,也就是知道这个修改地方的标签值,进行修改,例如我们经过查找以及标注的注释得知在这个地方。

image.png 我们来到代码中,我们要找到文档的根节点,然后找到g标签,进行找到path属性,进行修改这个地方的颜色值属性,我们将这个位置的属性修改为白色#ffffff颜色,下面我们来看一下代码。

//首先找到assets中的文件
factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
inputStream=this.getResources().getAssets().open("bixin.svg");
document = builder.parse(inputStream);
//找到根Element
Element root = document.getDocumentElement();
//找到g标签
NodeList nodes = root.getElementsByTagName("g");
//找到第8个 g标签  ==口罩的标签
Element item = (Element) nodes.item(8);
//找到path标签
NodeList pathTagName = item.getElementsByTagName("path");
//找到第一个path标签
Element item1 = (Element) pathTagName.item(0);
String nodeName = item1.getNodeName();
//改变属性颜色为 #ffffff 白色
item1.setAttribute("fill","#ffffff");

//将内存中的Document 写到手机存储文件
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.VERSION, "1");
//将整个Document对象作为要写入xml文件的数据源
DOMSource source = new DOMSource(document);
String path = getExternalFilesDir(null) + "/newSvg.svg";
//写入的目标文件
StreamResult src = new StreamResult(new File(path));
transformer.transform(source, src);

这样保存在手机存储中的文件就是被修改啦,我们运行对比看一下。

image.png

git文件地址