Pau*_*est 15 android aapt android-studio android-gradle-plugin
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结束

文件的例子在上面,但有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
Run Code Online (Sandbox Code Playgroud)
Android Gradle插件源代码位于https://android.googlesource.com/platform/tools/build/+/master.
如何自动解决问题(不检查不同分辨率的所有图像)
不可能.由于你希望.png表现得像九个补丁(沿着边缘展开,而不是拉伸整个位图),你将不得不格式化它们,因为你必须修改文件.
建议的替代方案
由于形状如此简单,您最好删除此文件的所有变体(在此过程中节省空间,时间和头痛)并/res/drawable/btn_bg_common_press.xml使用以下内容创建drawable:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="16dp"/>
<solid android:color="#ccc"/>
<stroke
android:color="#0c0"
android:width="2dp"/>
</shape>
Run Code Online (Sandbox Code Playgroud)
您可以使用dimen和color资源而不是硬编码值.另外,您可能想要在padding里面添加元素shape
<shape...>
<padding
android:top="8dp"
android:left="8dp"
android:bottom="8dp"
android:right="8dp"/>
</shape>
Run Code Online (Sandbox Code Playgroud)
和/或将shape元素包装在inset元素中.
<inset
xmlns:android="http://schemas.android.com/apk/res/android"
android:insetTop="8dp"
android:insetLeft="8dp"
android:insetBottom="8dp"
android:insetRight="8dp">
<shape...>
</inset>
Run Code Online (Sandbox Code Playgroud)
如果你这样做,drawable将有隐含的填充,你不必在样式小部件时设置它.由于按钮有多个状态可绘制,我建议您将所有状态转换为XML,以确保线条粗细和边角匹配.
尽管根元素的名称<shape>实际上是膨胀的GradientDrawable(意味着你可以用渐变而不是纯色填充它).查看所有选项的GradientDrawable文档.不要永远使用ShapeDrawable编程方式,它只是不工作.
分析9个补丁
考虑以下三个放大图像.

候选人#1是9补丁.它在每侧保留1px用于拉伸和填充规范.这个在拉伸时会表现为普通的位图.如果宽度将大于高度,那么边缘的边缘厚度也将如此.边界将按比例缩放.
候选人#2也是一个9补丁,并且实际上说它将扩展除1px边界之外的所有内容,并且每侧都会隐含3px的填充.拉伸时会有一个漂亮的1px边框.
候选人#3 不是九补丁.它的扩展方式与#1相同.
现在让我们来看看你在OP中包含的图像的放大版本:

正如你所看到的那样,它不是一个9补丁,所以它不会被解释为一个,而构建工具也足以警告你.即使较旧的构建工具更宽容并且每侧为您添加透明的1px,结果也会表现得像普通的位图,这意味着当拉伸它看起来像样本A而不是预期的结果样本B.

这里有九个补丁的更多阅读.这解释了每侧额外的1px用于什么.
给出的例子不是9补丁图像,因为它被告知.
如果您不想修改每个资源以将其转换为有效的9补丁资源,则可以尝试删除资源名称中的".9".这样,行为应该是相同的,并且您不会遇到构建错误.
| 归档时间: |
|
| 查看次数: |
18070 次 |
| 最近记录: |