SVG前戏—让你的View多姿多彩
什么是SVG
SVG的全称是Scalable Vector Graphics,叫可缩放矢量图形。是一种基于可扩展标记语言(XML)。它和位图(Bitmap)相对,SVG不会像位图一样因为缩放而让图片质量下降。它的优点在于节约空间,使用方便。
svg的优点
首先简要解释一下矢量图像格式和位图图像格式的区别。矢量图像用点和线来描述物体,所以文件会比较小,同时也能提供高清晰的画面,适合于直接打印或输出。而位图图像的存储单位是图像上每一点的像素值,因此一般的图像文件都很大,会占用大量的网络带宽。SVG是一种矢量图形格式,GIF、JPEG是光栅文件格式。有了两者的概念后,SVG较GIF、JPEG的优势显而易见。
- SVG 可被非常多的工具读取和修改(比如记事本)
- SVG 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强。
- SVG 是可伸缩的
- SVG 图像可在任何的分辨率下被高质量地打印
- SVG 可在图像质量不下降的情况下被放大
- SVG 图像中的文本是可选的,同时也是可搜索的(很适合制作地图)
- SVG 可以与 Java 技术一起运行
- SVG 是开放的标准
- SVG 文件是纯粹的 XML
- svg格式相对于.jpg、.png甚至.webp可以 省时间和 省空间


推荐项目学习地址
使用方法:
svg是在Android于5.0版本将该特性引入(Lollipop, API 21)。今天我们就讨论 一下在5.0以上版本中使用方法。
1)生成svg
1、可以找美工用PS或者是AI设计成图片后利用第三方工具进行转化为svg,以便我们能方便拿到svg数据
2、利用 Android Studio 具动态生成位图,Studio内置一个名为 Vector Asset Studio 的工具,在低版本SDK上编译APK期间,针对VectorDrawable脚本自动生成一组PNG位图资源BitmapDrawable,取代矢量图形(在5.0及以后的手机上运行时会正常引用VectorDrawable)。
需要配置build.gradle:
defaultConfig {
vectorDrawables.generatedDensities = ['hdpi','xxhdpi']
}
2)将普通SVG图片数据转换成Android可用数据
一般的SVG图片数据是直接在html或jsp中可以使用,对我们android开发者来讲是要 拿到svg.xml的资源的,我们可以使用NotPad++打开,查看源码

解析SVG数据
我们知道,svg是以xml数据格式来进行描述的,既然svg本质上就是xml文件,所以从解析角度来看,能解析xml文件的工具应该几乎都可以用来解析svg文件。
1、DOM解析
查看Android源码可以看出,5.0引入svg后并没有使用dom进行解析svg源文件,虽然svg号称完全支持dom标准。笔者从dom解析的过程可以看出,Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件。虽然一般情况下,svg文件是比较小的,但也不乏有些很复杂的图片会上升到M级别,如果在解析时需要全部载入,对于Android系统来说时比较耗时的,这也许就是dom遭Android淘汰的原因之一吧。
2、SAX解析
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用
3、PUll解析
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像 SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使 用,Android系统内部在解析各种XML时也是用PULL解析器
一般这种方式我们只有自定义View进行解析
创建View,开启线程,进行解析,可以自己自己的需求进行绘制和加载相应的动画
布局中正常加载View一样加载解析出来的svg
备注如果对于简单的已有svg的 vectordrawable.xml,直接可以如对ImageView设置背景动画
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="64dp"
android:width="64dp"
android:viewportHeight="600"
android:viewportWidth="600" >
<group
android:name="rotationGroup"
android:pivotX="300.0"
android:pivotY="300.0"
android:rotation="45.0" >
<path
android:name="v"
android:fillColor="#000000"
android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
</group>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/vectordrawable">
<target
android:name="rotationGroup"
android:animation="@animator/rotation" />
<target
android:name="v"
android:animation="@animator/path_morph" />
</animated-vector>
Drawable drawable = iv.getDrawable();
if (drawable instanceof Animatable) {
Animatable able = (Animatable) drawable;
able.start();
}
这种方式可以帮助我们解决用原生实现起来比较麻烦的一些特殊的需求。



使用SVG需要注意的是
一、SVG是在Android 5.0之后才支持的,所以如果想支持5.0之前的版本,最好使用兼容库。具体使用如下:
在build.gradle的defaultConfig中添加
vectorDrawables.useSupportLibrary = true
二、继承AppCompatActivity
Activity也需要继承AppCompatActivity
另外:如果想在Activity代码中动态设置SVG(VectorDrawable), 需要动态添加兼容
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
三、显示问题
1、 UI给的SVG图片应该显示的是白色,但是在Android设备上显示的确实黑色
2、 在某些手机上SVG会出现锯齿,给用户造成的感觉就是字体style都不一样
一般情况下UI给我们的SVG图片可能需要我们手动的修改一下,比如我们需要将fillColor改为“#FFFFFFFF”这样字体才能显示为白色。并且需要将width和height设置为120dp,否则会有锯齿
SVG的不足之处
矢量图的优点一大把,但也不是万能的。矢量图特别适合icon图标的应用场景,但是不能用于比如加载相册时,设置的placeholder或者error这类需要频繁切换回收的应用场景,否则会造成非常明显的卡顿,因为矢量图是不被硬件加速支持的。
阅读更多
如果有什么问题,欢迎来撩我
SVG前戏—让你的View多姿多彩的更多相关文章
- 高级UI特效—用SVG码造一个精美的中国地图
前言 来继续学习SVG,要想深入了解还是要多动手进行实战.关于svg基础可以去看一下我的上一篇文章<SVG前戏—让你的View多姿多彩>,今天就用SVG打造一个精美的UI效果. 正文 先上 ...
- 学了这么久,vue和微信小程序到底有什么样的区别?
前言 写了vue项目和小程序,发现二者有许多相同之处,在此想总结一下二者的共同点和区别.相比之下,小程序的钩子函数要简单得多. 一.生命周期 先贴两张图: vue生命周期 小程序生命周期 相比之下 ...
- 微信小程序 tp5上传图片
test.wxml页面 <view class="title">请选择要反馈的问题</view> <view> <picker bindc ...
- this.$apply()
chooseVideo(e) { this.fileInfo = {} let that = this wx.chooseVideo({ sourceType: ['album', 'camera'] ...
- 一个实现了View接口的Fragment
小程序并不新鲜,模式上先有百度轻应用,后有支付宝的各类小服务,再来还有腾讯自家QQ右下角的应用宝:技术上也就是FaceBook RN的那一套.一个技术上无创新,形式上无创意的事物,凭什么勾起了开发者们 ...
- 2.1 View的绘制
view绘制流程是从ViewRoot的performTraversals()方法中开始的,在该方法中会执行view绘制的三部曲,即:measure(测量视图的大小),layout(确定视图的位置)dr ...
- SVG 参考手册
1. SVG元素模块 Animation.Module animate animateColor animateTransform animateMotion set mpath 剪裁模块 clipP ...
- SVG 2D入门8 - 文档结构
前面介绍了很多的基本元素,包括结构相关的组合和重用元素,这里先对SVG的文档结构中剩下的相关元素简单总结一下,然后继续向前领略SVG的其他特性. SVG文档的元素基本可以分为以下几类: 动画元素:an ...
- SVG 2D入门6 - 坐标与变换
坐标系统 SVG存在两套坐标系统:视窗坐标系与用户坐标系.默认情况下,用户坐标系与视窗坐标系的点是一一对应的,都为原点在视窗的左上角,x轴水平向右,y轴竖直向下:如下图所示: SVG的视窗位置一般是由 ...
随机推荐
- 【noip 2016】普及组
T1.买铅笔 题目链接 #include<cstdio> #include<algorithm> #include<cstring> using namespace ...
- SQL SERVER中一些常见性能问题的总结
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免使用 left join 和 null 值判断.left join 比 in ...
- c# cbo控件
c# cbo控件 ,要获取选中的值 最好使用 ((强转的类型)selectitem).属性
- Docker 容器CPU设置
CPU使用率其实就是你运行的程序占用的CPU资源,表示你的机器在某个时间点的运行程序的情况.使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少.CPU使用率的高低与你的CPU强弱有直接关系. ...
- Java中常见的锁分类以及对应特点
对于 Java 锁的分类没有严格意义的规则,我们常说的分类一般都是依据锁的特性.锁的设计.锁的状态等进行归纳整理的,所以常见的分类如下: 公平锁和非公平锁:公平锁是多线程按照锁申请的顺序获取锁,非公平 ...
- 对Tomcat部署web应用的方式总结
对Tomcat部署web应用的方式总结,常见的有以下四种: 1.[使用控制台部署] 访问Http://localhost:8080,并通过Tomcat Manager登录,进入部署界面即可. 2.[利 ...
- Leetcode#832. Flipping an Image(翻转图像)
题目描述 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]. ...
- spring boot 与 spring cloud 关系
公司使用spring cloud,所以稍微了解一下 看了一下spring官网对 spring boot 以及 spring cloud 的解释 Spring Boot Spring Boot make ...
- 【tmos】创建自定义400、500页面
解决方案
- 安装.src.rpm
.src.rpm在坟墓镜像中能找到,例如6.8 os 的rpm包的.src.rpm格式就存放在http://vault.centos.org/6.8/os/Source/ .src.rpm是源码包,是 ...