生成时PNG生成不支持对其他资源的引用


Answers:


314

要支持<24的API SDK,请将以下行添加到您的应用中build.gradle

defaultConfig{
   vectorDrawables.useSupportLibrary = true
}

如果您的minSdkVersion为24或更高,那么您的问题将自行解决,因为从此API开始,VectorDrawables都具有完全支持。

有关详细信息,请参见Android开发者:Vector Drawables向后兼容解决方案


4
但是为什么会出现问题,并且上述解决方案是快速解决方案还是好的策略?
Pranaysharma

@Pranaysharma有关详细信息,请参见Android开发人员:Vector Drawables向后兼容解决方案
PointedEars

1
注意:useSupportLibrary对我来说是错误的解决方案(最低SDK 16,目标26),应用在启动时崩溃。我必须删除它,从向量中删除@color,然后手动搜索并替换所有android:fillColor =件。实际上这是非常快的,需要10秒
djdance '18

我在哪里添加这一行?
罗伊姆森

Android密钥内的@Roymunson。在此线程本身中查看Wonil的答案
RBT

14

您需要直接使用十六进制代码而不引用资源。

<vector
  <path
    android:fillColor="#FFF"/></vector>

1
它是一个回归版本...如果您想更改颜色,则可以一个一个地更改...在颜色文件中进行引用并进行更改更容易。
langme

不幸的是,这是使您的应用程序正常运行的唯一方法,或者您必须降级您的gradle版本
Oussema Aroua 17-10-27

3
我也有同样的问题。为什么以前可用的功能会被禁用?这可能是错误吗?
joaomgcd

我刚刚更新到AS3,也遇到了这个问题。为什么要删除该功能?
Marty

1
这是一种解决方法,但是“正确”的答案是@ mwa91的答案,要添加vectorDrawables.useSupportLibrary = true到您的中build.gradle
肖恩·巴尔博

9

此错误的更多上下文:

  • Android 5.0(API级别21)是第一个正式支持矢量可绘制对象的版本。
  • 如果您使用的minSdkVersion低于20,则有两种可绘制矢量的解决方案
    • Android Studio的Vector Asset Studio生成PNG。请看一下Android Studio文档。但是,生成时PNG生成不支持对其他资源的引用。
    • 使用支持库
  • 或者,对于minSdkVersion使用21或更高版本

对于支持库,在您的build.gradle文件中添加一条语句:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
  compile 'com.android.support:appcompat-v7:23.2.0'
}

@MikeHanafey您能否指出doc为什么minSdkVersion必须为24?谢谢。
Wonil

除非minSdkVersion增加到24,否则将出现以下消息。我没有任何解释,而是通过简单地增加值直到成功构建gradle来发现的。错误:java.lang.RuntimeException:java.lang.RuntimeException:处理./src/main/res/drawable/ic_selection_right_widen.xml时出错:无法处理属性android:fillColor =“ @ color / kb_key_long_press_available”:引用其他生成时PNG生成不支持资源。有关详细信息,请参见developer.android.com/tools/help/vector-asset-studio.html
Mike Hanafey

3
仅当您使用android:filltype时,@ MikeHanafey minSdkVersion才必须为24,有时Android Vector Asset自动将其放入。只需摆脱掉它即可。
西蒙妮

1
@Simone谢谢您的建议。就我而言,这就是问题所在。
阿卜杜勒·雷曼

默认fillType值为,nonZero但仅evenOdd在某些情况下有所不同:w3.org/TR/SVG/painting.html#FillRuleProperty
hmac

4

不要在Vector drawable的fillColor属性中使用colorReference,而仅使用六进制代码

这样使用

<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="#1abc9c"
    android:pathData="M9,11L7,11v2h2v-2zM13,11h-2v2h2v-2zM17,11h-2v2h2v-2zM19,4h-1L18,2h-2v2L8,4L8,2L6,2v2L5,4c-1.11,0 -1.99,0.9 -1.99,2L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM19,20L5,20L5,9h14v11z"/>

代替这个

<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="@color/colorPrimary"
    android:pathData="M9,11L7,11v2h2v-2zM13,11h-2v2h2v-2zM17,11h-2v2h2v-2zM19,4h-1L18,2h-2v2L8,4L8,2L6,2v2L5,4c-1.11,0 -1.99,0.9 -1.99,2L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM19,20L5,20L5,9h14v11z"/>


2
这是一个补丁,我希望能够在不重复所有可绘制对象的情况下重新设置我的应用程序的主题,而且它正在创建png而不是保持矢量。人们应该使用@ mwa91的解决方案。
奇奇瓦


0

通过执行以下操作,我已经能够解决此问题:

  1. 创建一个drawable-v21文件夹并复制所有在其中使用变量的可绘制xml
  2. 在原始可绘制文件夹中,将所有图标更改为使用静态颜色

这样编译器将工作


1
是的,可能是因为API 21支持Android 5.0(Lollipop),它本身就支持矢量可绘制对象。但是,使用早期版本的设备可能根本就没有合适的图像:developer.android.com/guide/topics/graphics/…–
PointedEars

0

我认为您正在使用android:fillColor="@color/image_button_disabled"此代码进行矢量可绘制。

// image_button_disabled.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/circular_image_color_pressed" android:state_pressed="true" />
    <item android:color="@color/circular_image_color_normal" />
</selector>

不支持。

只需将其替换为 android:fillColor="#c4ca5e"


0

要加起来@ mwa91 答案

如果您需要动态绘制drawable的主题,但又没有时间更新布局并使用@ mwa91 answer并将所有android:src="@drawable/..."属性更改为app:srcCompat="@drawable/...",则可以始终在drawable中使用十六进制颜色值,然后在ImageView中对drawable进行着色:

<ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/your_drawable"
      android:tint="@color/image_button_disabled"
      />
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.