Android 矢量图兼容低版本遇到的坑和问题解决

本文分享了作者在使用Android矢量图时遇到的兼容性问题及解决方案,特别是针对低版本系统的处理方法,包括Gradle配置、依赖配置、Activity设置及布局文件中的正确引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从朋友那里抢来个小米手机,安卓版本是api17,系统4.2,但是手机上显示居然是4.4.4,我也是呵呵了。

今天用这个低版本的手机测试我的的apk的时候,发现直接闪退崩溃了,而我定位不到问题所在,可以给大家看下报错的具体位置信息内容:

于是乎我就陷入了沉思当中,对!就是沉思!

诚然,矢量图的是谷歌在系统5.0推出的,所以在5.0以上的是没问题的,当时决定全面采用适量图的时候,因为没有低版本的测试机,所以我也犹豫了很久,不敢确定在低版本上会不会出现问题,今天正好出现了,其实按照官方的说法,想要兼容低版本的系统还是很简单的。ps:在这里就不做矢量图如何使用了,主要针对低版本进行下说明,但是我的这个问题严格上说确实不是低版本引起的兼容问题。

当时出现了崩溃,首先是想到的就是,可能是我在使用处理矢量图的时候不小心,使用方式出错了,导致在低版本上出现了崩溃,所以我就“好好的处理了一下”,更改了一些东西: 第一:

如果你的gradle tools的版本是高版本大于2.0的就可以直接用我第一个框框里面的配置就好了,如果是低版本就用我第二个框框里面的内容,这里的目的其实就是根据不同系统版本进行不同的处理,高版本的时候直接使用矢量图,低版本的时候打包后会在不同的drawable中生成不同的png文件, generatedDensities = []默认这种情况是生成所有目录下的png图片。

第二:

配置依赖。

第三:在咱们的Activity中调用这句话: static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }

第四:就是正常的使用了,如果activity是继承ActivityCompat,那么咱们就用ImageView就好,会自动转成AppCompatImageView,如果非ActivityCompat,那就用AppCompatImageView,我为了慎重考虑,都用了AppCompatImageView,并在在java代码中我设置的背景都是采用了setImageResource的方式,设置图片如图:

其实内容就是这么多,我一直是这样配置和使用的,按照道理是没问题的,可是我依旧崩溃,有点方,有点慌张,有点。。。。。。那个。。。。

我采取了死磕的办法,第一步先看报错,肯定能找到蛛丝马迹,第二步再看下谷歌的官方文档吧。

然后我就发现了一个细节,我居然找到了,报错的一个细节

我找到了xml引用该资源的位置,
没错!!!我是把该矢量图作为了我的RelativeLayout背景图片使用了,但是这就能说明是它引起的崩溃么!!!!????!?!?!??!。 不要慌,咱们去看Google官方api看一下。

“You don’t have to use StateListDrawable. It also works with InsetDrawable, LayerDrawable, LevelListDrawable and RotateDrawable containers. The only rule is that the vector needs to be in a separate file.”

Emmmmmm我陷入了沉思当中,并且差点睡着。

在android官方推文中找到这句话 , 意味着,我们要在普通控件上使用Vector,就必须依附于StateListDrawable,InsetDrawable,LayerDrawable,LevelListDrawable,RotateDrawable,所以我来试试?

并且在布局中使用该方式的引用资源,这样就可以了吧,运行下,完美运行了!

关于矢量图的看法:首先可以完美的解决兼容问题,效果还是很显著的,当然一直都在说用矢量图完成自带动画有坑的这个问题我还没去尝试,不过如果借助矢量图设置控件的动画在运动过程中确实会出现失真的现象;在用矢量图的过程却是很麻烦考验耐心,图是一个个去导入,而且要自己手动的生成drawable文件目的就是解决我的上述问题(应该是包括布局背景textview和button都好像会出现问题),真的有点麻烦的说。匆忙的写完总结,赶紧下班了,有机会再说!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值