构建时 PNG 生成不支持对其他资源的引用
References to other resources are not supported by build-time PNG generation
AndroidStudio 3.0 / Android Gradle 插件 3.0
<vector>
<path android:fillColor="@color/image_button_disabled"/>
</vector>
我收到这个错误:
references to other resources are not supported by build-time PNG generation
是否有可能解决它或者它是一个已弃用的解决方案?
您需要直接使用十六进制代码而不是引用资源。
<vector
<path
android:fillColor="#FFF"/></vector>
我已经通过执行以下操作解决了这个问题:
- 创建一个 drawable-v21 文件夹并复制所有使用变量的 drawable xml
- 在原始可绘制文件夹中将所有图标更改为使用静态颜色
这样编译器就可以工作了
要支持 API SDK < 24,请将以下行添加到您的应用程序 build.gradle
的 android
块内:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
如果您的 minSdkVersion 是 24 或更高版本,那么您的问题将自行解决,因为 VectorDrawables 从这个 API.
开始得到全面支持
详情见Android Developers: Vector Drawables Backward Compatibility Solution。
不要在 Vector 可绘制对象的 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"/>
此错误的更多上下文:
- Android 5.0(API 级别 21)是第一个正式支持矢量绘图的版本。
- 如果使用低于20的minSdkVersion,vector drawable有两种解决方案
- Android Studio 的 Vector Asset Studio 生成 PNG。请看Android Studio document。但是,构建时 PNG 生成不支持对其他资源的引用。
- 使用支持库
- 或者,为 minSdkVersion 使用 21 或更高版本
对于支持库,将语句添加到您的 build.gradle 文件:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
compile 'com.android.support:appcompat-v7:23.2.0'
}
如果您的 minSdkVersion 是 21,您可以通过添加以下行来禁用 PNG 的生成:
// set to an empty list to disable the feature
vectorDrawables.generatedDensities = []
删除此行仍会生成 PNG。
我认为您正在使用 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 。
如果您需要 drawable 的动态主题,但没有时间更新布局并使用 @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"
/>
删除 filltype 并且警告将消失。那是因为:
minSdkVersion must be 24 only if you use android:filltype
The default fillType is nonZero but it only differs from evenOdd in certain cases
当然,请确保您不需要 filltype。在某些情况下,它可能会影响矢量可绘制对象的外观。如果您的图标很简单,您很可能不需要它。它有时会自动添加,例如当您从 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
。
AndroidStudio 3.0 / Android Gradle 插件 3.0
<vector>
<path android:fillColor="@color/image_button_disabled"/>
</vector>
我收到这个错误:
references to other resources are not supported by build-time PNG generation
是否有可能解决它或者它是一个已弃用的解决方案?
您需要直接使用十六进制代码而不是引用资源。
<vector
<path
android:fillColor="#FFF"/></vector>
我已经通过执行以下操作解决了这个问题:
- 创建一个 drawable-v21 文件夹并复制所有使用变量的 drawable xml
- 在原始可绘制文件夹中将所有图标更改为使用静态颜色
这样编译器就可以工作了
要支持 API SDK < 24,请将以下行添加到您的应用程序 build.gradle
的 android
块内:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
如果您的 minSdkVersion 是 24 或更高版本,那么您的问题将自行解决,因为 VectorDrawables 从这个 API.
开始得到全面支持详情见Android Developers: Vector Drawables Backward Compatibility Solution。
不要在 Vector 可绘制对象的 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"/>
此错误的更多上下文:
- Android 5.0(API 级别 21)是第一个正式支持矢量绘图的版本。
- 如果使用低于20的minSdkVersion,vector drawable有两种解决方案
- Android Studio 的 Vector Asset Studio 生成 PNG。请看Android Studio document。但是,构建时 PNG 生成不支持对其他资源的引用。
- 使用支持库
- 或者,为 minSdkVersion 使用 21 或更高版本
对于支持库,将语句添加到您的 build.gradle 文件:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
compile 'com.android.support:appcompat-v7:23.2.0'
}
如果您的 minSdkVersion 是 21,您可以通过添加以下行来禁用 PNG 的生成:
// set to an empty list to disable the feature
vectorDrawables.generatedDensities = []
删除此行仍会生成 PNG。
我认为您正在使用 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
如果您需要 drawable 的动态主题,但没有时间更新布局并使用 @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"
/>
删除 filltype 并且警告将消失。那是因为:
minSdkVersion must be 24 only if you use android:filltype
The default fillType is nonZero but it only differs from evenOdd in certain cases
当然,请确保您不需要 filltype。在某些情况下,它可能会影响矢量可绘制对象的外观。如果您的图标很简单,您很可能不需要它。它有时会自动添加,例如当您从 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
。