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


AndroidStudio 3.0

/Android Gradle plugin 3.0

<vector>
  <path android:fillColor="@color/image_button_disabled"/>
</vector>

我收到此错误:

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

是否可以解决它,或者它是一个已弃用的解决方案?

若要支持 API SDK <24,请将以下行添加到android块内的应用build.gradle

defaultConfig {
   vectorDrawables.useSupportLibrary = true
}

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

有关详细信息,请参阅 Android 开发人员:矢量可绘制对象向后兼容性解决方案。

您需要

直接使用十六进制代码,而不是引用资源。

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

此错误的更多上下文:

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

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

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}
dependencies {
  compile 'com.android.support:appcompat-v7:23.2.0'
}

不要在矢量可绘制对象中的填充颜色属性中使用颜色引用,只需使用六进制代码

像这样使用

<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"/>

如果您的 minSdkVersion 是 21,您可以通过添加以下行来禁用 PNG 的生成:

// set to an empty list to disable the feature
vectorDrawables.generatedDensities = [] 

删除此行仍将生成 PNG。

源:http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.VectorDrawablesOptions.html

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

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

这样编译器就可以工作了

我认为您正在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"

加起来@mwa91答案。

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

<ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/your_drawable"
      android:tint="@color/image_button_disabled"
      />

删除填充类型,警告将消失。这是因为:

minSdkVersion 必须为 24 仅当您使用 android:filltype 时

默认的 fillType 是非零的,但在某些情况下它只与 evenOdd 不同

当然,请确保您不需要填充类型。在某些情况下,它可能会影响矢量可绘制对象的外观。如果您的图标很简单,您很可能不需要它。它有时会自动添加,例如当您从 SVG 导入矢量可绘制对象时。

查看此页面以获取其功能的说明 w3.org/TR/SVG/painting.html#FillRuleProperty

功劳归于@Simone和@hmac

<小时 />

一个简单的替代方法是直接使用颜色值,而不是使用颜色引用。

android:fillColor="#FF00AABB" // use this
android:fillColor="@color/image_button_disabled" // instead of this

另一种选择是设置这个,但我宁愿避免它:

defaultConfig {
   vectorDrawables.useSupportLibrary = true
}

最后的替代方案是 increase your minSdkVersion to 24 .

最新更新