自己写一个svg转化为安卓xml的工具类

news/2024/5/17 20:08:33 标签: gitee

自己写一个svg转化为安卓xml的工具类_张风捷特烈的博客-CSDN博客

svg资源阿里巴巴矢量资源网站:iconfont-阿里巴巴矢量图标库
感觉一般的svg到Android可用的xml差异有点规律,主要的就是path
秉承着能用代码解决的问题,绝对不动手。能够靠智商解决的问题,绝对不靠体力的大无畏精神:
写段代码批处理一下,要比一个一个在网上转换方便一些。

1.样例svg

<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1540950990615" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" 
    xmlns="http://www.w3.org/2000/svg" p-id="10665" 
    xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48">
 
    <defs>
        <style type="text/css"></style>
    </defs>
 
    <path d="M257.22 814.53a36.46 36.46 0 0 1-25.78-62.24L471.73 512 231.44 271.71A36.46 36.46 0 0 1 283 220.15l246.77 246.73a63.83 63.83 0 0 1 0 90.2L283 803.85a36.35 36.35 0 0 1-25.78 10.68z" fill="#42494F" p-id="10666">
    </path>
    
    <path d="M512 814.53a36.46 36.46 0 0 1-25.78-62.24L726.47 512 486.18 271.71a36.46 36.46 0 0 1 51.56-51.56l246.77 246.73a63.66 63.66 0 0 1 0 90.2L537.75 803.85A36.35 36.35 0 0 1 512 814.53z" fill="#42494F" p-id="10667">
    </path>
</svg>

2.转化成的Android可用的xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="48dp"
        android:height="48dp"
        android:viewportWidth="1024"
        android:viewportHeight="1024">
    <path
        android:fillColor="#FF7F47"
        android:pathData="M257.22 814.53a36.46 36.46 0 0 1-25.78-62.24L471.73 512 231.44 271.71A36.46 36.46 0 0 1 283 220.15l246.77 246.73a63.83 63.83 0 0 1 0 90.2L283 803.85a36.35 36.35 0 0 1-25.78 10.68z"/>
    <path
        android:fillColor="#FF7F47"
        android:pathData="M512 814.53a36.46 36.46 0 0 1-25.78-62.24L726.47 512 486.18 271.71a36.46 36.46 0 0 1 51.56-51.56l246.77 246.73a63.66 63.66 0 0 1 0 90.2L537.75 803.85A36.35 36.35 0 0 1 512 814.53z"/>
</vector>


一、转换一个svg文件的代码:
   

 /**
     * 将.svg文件转换为安卓可用的.xml
     *
     * @param file 文件路径
     */
    public static void svg2xml(File file) {
        if (!file.exists() && file.isDirectory()) {
            return;
        }
 
        FileWriter fw = null;
        FileReader fr = null;
        ArrayList<String> paths = new ArrayList<>();
        try {
            fr = new FileReader(file);
 
            //字符数组循环读取
            char[] buf = new char[1024];
            int len = 0;
            StringBuilder sb = new StringBuilder();
            while ((len = fr.read(buf)) != -1) {
                sb.append(new String(buf, 0, len));
            }
 
            //收集所有path
            collectPaths(sb.toString(), paths);
            //拼接字符串
            StringBuilder outSb = contactStr(paths);
            //写出到磁盘
            File outFile = new File(file.getParentFile(), file.getName().substring(0, file.getName().lastIndexOf(".")) + ".xml");
            fw = new FileWriter(outFile);
            fw.write(outSb.toString());
 
            System.out.println("OK:" + outFile.getAbsolutePath());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fw != null) {
                    fw.close();
                }
                if (fr != null) {
                    fr.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * 拼接字符串
     *
     * @param paths
     * @return
     */
    private static StringBuilder contactStr(ArrayList<String> paths) {
        StringBuilder outSb = new StringBuilder();
        outSb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                "        android:width=\"48dp\"\n" +
                "        android:height=\"48dp\"\n" +
                "        android:viewportWidth=\"1024\"\n" +
 
                "        android:viewportHeight=\"1024\">\n");
 
        for (String path : paths) {
            outSb.append("    <path\n" +
                    "        android:fillColor=\"#FF7F47\"\nandroid:pathData=");
            outSb.append(path);
            outSb.append("/>");
        }
 
        outSb.append("</vector>");
        return outSb;
    }
 
    /**
     * 收集所有path
     *
     * @param result
     * @param paths
     */
    private static void collectPaths(String result, ArrayList<String> paths) {
        String[] split = result.split("<path");
        for (String s : split) {
            if (s.contains("path")) {
                int endIndex;
                if (!s.contains("fill")) {
                    endIndex = s.indexOf("p");
                } else {
                    endIndex = Math.min(s.indexOf("f"), s.indexOf("p"));
                }
                String path = s.substring(s.indexOf("\""), endIndex);
                paths.add(path);
            }
        }
    }
转换一个文件夹里的所有svg图片
/**
 * 将一个文件夹里的所有svg转换为xml
 *
 * @param filePath
 */
public static void svg2xmlFromDir(String filePath) {
    File file = new File(filePath);
    if (file.isDirectory()) {
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.getName().endsWith(".svg")) {
                System.out.println(f);
                svg2xml(f);
            }
        }
    } else {
        svg2xml(file);
    }
}


将xml放在drawable目录下,就可以当资源文件用了,大小颜色都可以操作
————————————————
版权声明:本文为CSDN博主「张风捷特烈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30447263/article/details/83594228


http://www.niftyadmin.cn/n/4960648.html

相关文章

目标检测任务数据集的数据增强中,图像水平翻转和xml标注文件坐标调整

需求&#xff1a; 数据集的数据增强中&#xff0c;有时需要用到图像水平翻转的操作&#xff0c;图像水平翻转后&#xff0c;对应的xml标注文件也需要做坐标的调整。 解决方法&#xff1a; 使用pythonopencvimport xml.etree.ElementTree对图像水平翻转和xml标注…

Mac Flutter web环境搭建

获取 Flutter SDK 下载以下安装包来获取最新的 stable Flutter SDK将文件解压到目标路径, 比如: cd ~/development $ unzip ~/Downloads/flutter_macos_3.13.0-stable.zip 配置 flutter 的 PATH 环境变量&#xff1a; export PATH"$PATH:pwd/flutter/bin" // 这个命…

ELK中Logstash的基本配置和用法

文章目录 Logstash的条件判断Logstash的输入插件Stdin输入文件内容输入filter过滤器 Logstash的输出插件测试收集日志启动kibana在kibana中配置索引数据 在 《Elasticsearch搜索引擎系统入门》中简单描述了Logstah的安装&#xff0c;本篇文章将较为详细的讲解Logstash的基本配置…

python 声音录制、保存及播放

参考&#xff1a; https://huggingface.co/suno/bark 1、录制、保存 参考&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/131269539&#xff08;ffmpeg也可以录制&#xff09; 下面使用的sounddevice包录制 import scipysampling_rate model.config…

JavaHashMap的扩容机制

我们希望在内存中临时存放一些数据&#xff0c;那么我们可以使用官方提供的封装好的集合&#xff0c;比如List、HahsMap、Set等&#xff0c;作为数据存储的容器 创建集合 当我们创建一个集合对象的时候&#xff0c;实际上就是在内存里面一次性申请内存空间&#xff0c;而这个…

Django基础2——URL路由系统

文章目录 一、基本了解二、url路由分发三、正则匹配四、压缩归档超链接优化一&#xff1a;使用分组名称功能优化二&#xff1a;使用url名称功能4.1 使用功能之前效果展示4.2 使用功能之后效果展示 一、基本了解 概念&#xff1a; 路由系统就是URL路径和视图函数的一个对应关系&…

AWS EC2 docker-compose部署MongoDB4.2

环境准备 安装docker 参考EC2官方文档&#xff1a;创建容器镜像以在 Amazon ECS 上使用 - Amazon Elastic Container Service sudo yum update -y sudo amazon-linux-extras install docker sudo usermod -a -G docker ec2-user sudo systemctl enable docker sudo systemct…

Android创建签名文件,并获取签名文件MD5,SHA1,SHA256值

一、创建Android签名文件 使用Android Studio开发工具&#xff0c;可视化窗口进行创建 第一步&#xff1a;点击AndroidStudio导航栏上的 Build→Generate Signed Bundle / APK 第二步&#xff1a;选择APK选项 第三步&#xff1a;创建签名文件 第四步&#xff1a;输入创建签名的…