前言
上周五刚上的新版本,早上我正在回顾之前的知识
这时PM走过来拍了拍我的肩膀说:看下这个什么问题,崩了!
然后他扬长而去,留下凌乱的我,我赶紧打开Bugly抓到的错误,看下如下提示:
错误提示:
# main(1)
org.xmlpull.v1.XmlPullParserException
Binary XML file line #1: invalid drawable tag vector
1 android.view.InflateException:Binary XML file line #21: Error inflating class
com.jxty.app.garden.customviews.CartAmountView
2 android.view.LayoutInflater.createView(LayoutInflater.java:640)
3 ......
4 Caused by:
5 org.xmlpull.v1.XmlPullParserException:Binary XML file line #1: invalid drawable tag vector
根据上面的错误信息 我只能了解到是自定义View包下的CartAmountView类出了问题
,于是开始排查错误
首先看下Bugly
抓到的错误手机信息
看到我标注的红色 可以看出 是华为品牌的4.4.2版本
看到这里 基本可以考虑的就是低版本兼容性问题了,那么是什么问题导致低版本兼容的呢?
羊毛出在羊身上
我还是得顺着错误根源自定义View包下的CartAmountView类
找
于是我在打开xml布局时 发现了问题!其中一个资源设置如下:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF898989"
android:pathData="M19,13H5v-2h14v2z"/>
</vector>
这是什么?
随着android L的发布,带来了VectorDrawable,矢量图的支持
大概解释下何为矢量图?
:
矢量图,也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。
矢量图是根据几何特性来绘制图形,矢量可以是一个点或一条线,矢量图只能靠软件生成,文件占用内在空间较小,因为这种类型的图像文件包含独立的分离图像,可以自由无限制的重新组合。它的特点是放大后图像不会失真,和分辨率无关,适用于图形设计、文字设计和一些标志设计、版式设计等
矢量图在很久很久以前就已经应用起来了,是一种基于xml的图像,因为图片不提供具体的像素,
只提供的是绘图的指令,所以好处是 占用内存非常小,性能高,可以任意缩放而不会失真,但是缺点也很明显
没有位图表达的色彩丰富。
然而现在app风格越来越扁平, 拟物化已经成了过去,矢量图成了越来越多人的选择。
但是,Android和iOS对于矢量图的支持还非常弱.
安卓5.0Lollipop发布以来VectorDrawable作为安卓环境下的矢量化图形的方式一直由于兼容性问题而很少被用到,由于只能用于5.0以上系统,导致现在多少安卓机无法使用而一直被开发人员无限搁置。在官方给出兼容性的解决方案之前,开发者社区已经有几个解决方案了。比如:
https://github.com/trello/victor
https://github.com/telly/MrVector
https://github.com/wnafee/vector-compat
但是就效果和易用性而言,我个人并不看好,其中MrVector已经停止维护,而vector-compat也已经很长时间没有更新过,而且经博主测试发现仅适用于Android gradle plugin 1.4以下的版本,1.5以后存在无法正确编译的问题。
官方也一直没有给出一个 VectorDrawableCompat 支持库来解决兼容性问题。
Android gradle plugin 1.5发布以后,加入了一个跟VectorDrawable有关的新功能。Android build tools 提供了另外一种解决兼容性的方案,如果编译的版本是5.0之前的版本,那么build tools 会把VectorDrawable生成对应的png图片,这样在5.0以下的版本则使用的是生成的png图,而在5.0以上的版本中则使用VectorDrawable
矢量图的缺点:
-
1.麻烦, 需要下载->vector asset转换->用在非imageview中还要再写一个xml包裹起来才可用
-
2.不能随心所欲的在xml布局中任意切换图标颜色 , 如果在vector的xml里面改fillcolor,则这个图标就不好复用了。我的意思则是一处创建,随意使用。
-
3.支持库正在更新的过程中, 可能出现各种各样bug,也可能出现前面改动api实现而掉坑的情况。
问题解决方案:
-
一: 舍去矢量图的使用 改用其他方案解决问题(我用的就是这个办法)
-
二:使用以下代码片段来配置vectorDrawables元素:
//For Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true //适配API 21以下的手机
}
}
与君共勉
我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天