VectorDrawable在API 23上无法正确呈现

git*_*ter 27 android android-vectordrawable

我尽可能用VectorDrawables替换所有图标.但是我注意到它们中的一些在API 23上无法正确渲染,颜色似乎正在流失.其中一个渲染很好.这是我创建的一个孤立项目的屏幕截图:

在此输入图像描述

在API 21上看起来非常好:

在此输入图像描述

示例应用程序的源代码在这里

我在ImageView上使用AppCompat 24.0.0,app:srcCompat并设置了vectorDrawables.useSupportLibrary = true.我还尝试使用目标23的AppCompat 23.4.0.但是,如果我删除appCompat并将minSdkVersion设置为21并使用本机矢量支持,则结果不会更改.IDE不会抱怨任何不受支持的内容.我如何找出问题所在?这是一个平台错误吗?有没有解决方法?

Luk*_*uke 30

我在API 23上只有完全相同的问题.我是动态设置我的ImageView源,而不是在xml中.我意识到问题在于我在做什么:

Drawable show = getContext().getResources().getDrawable(resourceId);
Run Code Online (Sandbox Code Playgroud)

当我应该做的时候:

Drawable show = AppCompatResources.getDrawable(getContext(), resourceId);
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人!

  • 这绝对是问题,我有大约100个图标的类似渲染问题,他们都通过改变这一点得到修复.谢谢!同样调用`ContextCompat.getDrawable`也不起作用. (4认同)
  • 这正是我做错了.感谢您的输入 (3认同)

小智 20

首先,我不是Android开发人员,我是设计师,协助Android Studio中的一些生产资产.

我们开始遇到与22个移动到24的矢量绘图相同的问题.

(我更新了我的项目以使用Nexus 6 API 23并编译版本24,构建版本24,目标SDK 24.然后我的drawables似乎是关闭路径并添加类似于上面发生的填充.)

试着

我可以访问Adobe Illustrator CC(19.2.1),并且一直在探索具有笔划的对象上的各种路径选项.从扩展路径到填充,组合路径,制作复合路径,关闭路径等等一切都没有运气.

转换器选项

在线SVG到Drawable转换器(http://inloop.github.io/svg2android/)有一个选项," Bake转换成路径(实验) ",我选择了它,虽然它改进了渲染,但它还不完美.

潜在解决方案

然后我再次进入Illustrator并尝试将" 另存为 "SVG与" 导出 "作为SVG.我不确定Adobe Illustrator在这两个设置之间的区别是什么,但它们确实吐出了略微不同的SVG XML数据.

然后我拿了新的"另存为SVG"并将其放入这个在线Drawable转换器:http://inloop.github.io/svg2android/

并检查了这些选项:

  • 删除没有属性的空组
  • 烘焙转化为路径(实验)

它返回的新Drawable XML似乎正常工作和渲染.

我不确定这是否适用于其他具有笔画,形状和填充的矢量图形,但我想我会分享我的经验.这不是一个真正的解决方案,因为它似乎是新Android SDK中的一个错误,并且之前已经支持过它,但它可能是某些人可能的临时工作.

  • 我确认,即使不使用http://inloop.github.io/svg2android/,Illutrator的"sa ve as"也会产生精细的svg,但"export"却没有. (2认同)

Ped*_*mão 20

阅读此媒体以获得更详细的解释 https://medium.com/androiddevelopers/using-vector-assets-in-android-apps-4318fd662eb9

TL; 博士

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}
Run Code Online (Sandbox Code Playgroud)

app:srcCompat
app:buttonCompat
app:drawableStartCompat...
Run Code Online (Sandbox Code Playgroud)

代替

android:src
android:button
android:drawableStart
Run Code Online (Sandbox Code Playgroud)

以编程方式

AppCompatResources.getDrawable(context, R.drawable.my_drawable)
Run Code Online (Sandbox Code Playgroud)