作者:欧阳火凡 | 来源:互联网 | 2023-05-22 12:59
Android Studio(使用SDK 19,21或22)显示Eclipse ADT(使用SDK 19)不会出现错误:
错误:9-patch image D:\ Workspaces ....\res\drawable-hdpi\btn_bg_common_press.9.png格式错误.错误:帧像素必须是实心或透明(不是中间alpha). - 在顶部边缘的像素#4处找到.
或者另一个错误:
错误:透明框中的刻度必须为黑色或红色.
内在的 aapt
错误:错误:com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:处理'命令'E:\ Android\sdk-Android-Studio\build-tools\19.1.0\aapt .exe''以非零退出值42结束
![btn_bg_common_press.9.png](https://img.php1.cn/3cd4a/1eebe/cd5/857a46d091981bac.webp)
文件的例子在上面,但有20多个这样的文件运作良好.
如何让Android Studio或Gradle跳过此错误而不会失败而不必逐个修改这些文件?
如果使用Gradle无法实现,我可以用什么命令行工具替换所有透明像素?
应用程序模块(资源所在的)的build.gradle文件如下所示.
我已经尝试过SDK 19和SDK 21以及构建工具19.1,21.1.2,22.
AOSP上的类似问题,问题159464:Android studio:mergeDebugResources导入Eclipse项目时失败.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.1.+'
}
}
allprojects {
repositories {
jcenter()
}
}
//---
task wrapper(type: Wrapper) {
gradleVersion = '2.2.1'
}
apply plugin: 'com.android.application'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':afinal')
compile 'com.android.support:appcompat-v7:19.0.+'
//compile 'com.android.support:appcompat-v7:21.0.+'
}
//---
android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
compileSdkVersion 19
buildToolsVersion "19.1.0"
//compileSdkVersion 21
//buildToolsVersion "21.1.2"
//compileSdkVersion Integer.parseInt(project.COMPILE_SDK_VERSION)
//buildToolsVersion project.BUILD_TOOLS_VERSION
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
zipAlignEnabled true
//signingConfig signingConfigs.release
}
debug {
zipAlignEnabled true
}
}
lintOptions {
//checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false // false also required by https://wiki.jenkins-ci.org/display/JENKINS/Android+Lint+Plugin
}
}//android
Android Gradle插件源代码位于https://android.googlesource.com/platform/tools/build/+/master.
1> Eugen Pechan..:
如何自动解决问题(不检查不同分辨率的所有图像)
不可能.由于你希望.png表现得像九个补丁(沿着边缘展开,而不是拉伸整个位图),你将不得不格式化它们,因为你必须修改文件.
建议的替代方案
由于形状如此简单,您最好删除此文件的所有变体(在此过程中节省空间,时间和头痛)并/res/drawable/btn_bg_common_press.xml
使用以下内容创建drawable:
您可以使用dimen
和color
资源而不是硬编码值.另外,您可能想要在padding
里面添加元素shape
和/或将shape
元素包装在inset
元素中.
如果你这样做,drawable将有隐含的填充,你不必在样式小部件时设置它.由于按钮有多个状态可绘制,我建议您将所有状态转换为XML,以确保线条粗细和边角匹配.
尽管根元素的名称
实际上是膨胀的GradientDrawable
(意味着你可以用渐变而不是纯色填充它).查看所有选项的GradientDrawable
文档.不要永远使用ShapeDrawable
编程方式,它只是不工作.
分析9个补丁
考虑以下三个放大图像.
![九贴片样本](https://img.php1.cn/3cd4a/1eebe/cd5/5287a7b3296ea13e.webp)
候选人#1是9补丁.它在每侧保留1px用于拉伸和填充规范.这个在拉伸时会表现为普通的位图.如果宽度将大于高度,那么边缘的边缘厚度也将如此.边界将按比例缩放.
候选人#2也是一个9补丁,并且实际上说它将扩展除1px边界之外的所有内容,并且每侧都会隐含3px的填充.拉伸时会有一个漂亮的1px边框.
候选人#3 不是九补丁.它的扩展方式与#1相同.
现在让我们来看看你在OP中包含的图像的放大版本:
![来自OP的放大图片](https://img.php1.cn/3cd4a/1eebe/cd5/67cc2e96eddffff8.png)
正如你所看到的那样,它不是一个9补丁,所以它不会被解释为一个,而构建工具也足以警告你.即使较旧的构建工具更宽容并且每侧为您添加透明的1px,结果也会表现得像普通的位图,这意味着当拉伸它看起来像样本A而不是预期的结果样本B.
![比较位图和九个补丁](https://img.php1.cn/3cd4a/1eebe/cd5/4fae50aeee651818.webp)
这里有九个补丁的更多阅读.这解释了每侧额外的1px用于什么.
2> Jofre Mateu..:
给出的例子不是9补丁图像,因为它被告知.
如果您不想修改每个资源以将其转换为有效的9补丁资源,则可以尝试删除资源名称中的".9".这样,行为应该是相同的,并且您不会遇到构建错误.