Автоматически решать проблему с сборкой Android: пиксели кадра должны быть сплошными или прозрачными (не промежуточными альфа). - Найден в пикселе # 4 вдоль верхнего края
Android Studio (с использованием SDK 19, 21 или 22) показывает ошибку, которую Eclipse ADT (используя SDK 19) не выполняет:
Ошибка: 9-патч-образ D:\Workspaces....\res\drawable-hdpi\btn_bg_common_press.9.png неверный. Ошибка: пиксели кадра должны быть сплошными или прозрачными (не промежуточными альфа). - Найден в пикселе # 4 вдоль верхнего края.
Или еще одна ошибка:
Ошибка: клещи в прозрачной рамке должны быть черными или красными.
как внутри aapt
Ошибка: ошибка: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command' E:\Android\sdk-Android-Studio\build-tools\19.1. 0\aapt.exe '' завершено с ненулевым значением выхода 42
![btn_bg_common_press.9.png]()
Пример файла выше, но есть 20+ таких файлов, которые хорошо работали.
Как заставить Android Studio или Gradle пропустить эту ошибку и не работать без необходимости изменять эти файлы один за другим?
Если это невозможно с Gradle, какой инструмент командной строки я мог бы использовать, чтобы заменить весь прозрачный пиксель непрозрачным?
Файл build.gradle для прикладного модуля (где есть ресурсы) находится ниже.
Я пробовал оба с SDK 19 и SDK 21 и инструменты построения 19.1, 21.1.2, 22.
Аналогичная проблема в AOSP, Проблема 159464: Android studio: mergeDebugResources FAILED при импорте проекта 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
Как автоматически решить проблему (без проверки всех изображений в разных разрешениях)
Невозможно. Поскольку вы хотите, чтобы .png вел себя как девяти патч (расширяйте по краям, не растягивайте весь растровый рисунок), вам придется отформатировать их как эрго, вы должны изменить файлы.
Предлагаемая альтернатива
Так как форма настолько проста, вам лучше удалить все варианты этого файла (экономя пространство, время и головную боль в процессе) и создайте /res/drawable/btn_bg_common_press.xml
с последующим содержимым:
<?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>
Вы можете использовать ресурсы dimen
и color
вместо жестко заданных значений. Кроме того, вы можете добавить элемент padding
внутри shape
<shape...>
<padding
android:top="8dp"
android:left="8dp"
android:bottom="8dp"
android:right="8dp"/>
</shape>
и/или оберните элемент 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>
Если вы это сделаете, то в drawable будет подразумеваться прокладка, и вам не придется устанавливать ее при создании виджетов. Поскольку у вас есть несколько отображаемых состояний для кнопки, я предлагаю вам преобразовать их все в XML, чтобы убедиться, что толщина линии и углы соответствуют.
Несмотря на название корневого элемента <shape>
на самом деле раздувается до GradientDrawable
(это означает, что вы можете заполнить его градиентом вместо сплошного цвета). Просмотрите GradientDrawable
docs для всех своих опций. Никогда не используйте программный код ShapeDrawable
, он просто не работает.
Анализ 9 патчей
Рассмотрим три следующих увеличенных изображения.
![Nine-patch samples]()
Кандидат №1 - это девятипартик. Он зарезервировал 1px с каждой стороны для спецификации растяжения и заполнения. Это будет вести себя как обычное растровое изображение при растяжении. Если ширина будет больше высоты, то и толщина границы по бокам. Граница будет масштабироваться пропорционально.
Кандидат № 2 также является девятипалатом и на самом деле говорит, что он будет растягивать все, кроме границы 1px, и будет иметь подразумеваемое дополнение 3px с каждой стороны. При растяжении у него будет хорошая четкая граница 1px.
Кандидат № 3 НЕ девятикратный патч. Он масштабируется так же, как # 1.
Теперь взглянем на увеличенную версию изображения, которое вы включили в OP:
![Enlarged image from OP]()
Как вы видите, это не девять патчей, поэтому он не будет интерпретироваться как один, а инструменты сборки достаточно любезны, чтобы предупредить вас об этом. Даже если старые инструменты сборки были более прощающими и добавляли для вас прозрачную 1px с каждой стороны, результат вел бы себя как обычное растровое изображение, то есть при растяжении оно выглядело бы как образец A вместо ожидаемого образца результата B.
![Comparison of a bitmap and a nine-patch]()
Здесь больше читает на девяти патчах. Это объясняет, для чего используются дополнительные 1px с каждой стороны.
Ответ 2
Приведенный пример - это не 9 патч-изображений, как было сказано.
Если вы не хотите изменять каждый ресурс, чтобы преобразовать его в действительный 9 ресурс патча, вы можете попробовать удалить ".9" в имени ресурса. Таким образом, поведение должно быть одинаковым, и вы не получите ошибок сборки.
Ответ 3
Android теперь имеет два PNG-crunchers, один AAPT и один Java. Чтобы игнорировать ошибку PNG в процессе сборки, вы можете force Gradle build использовать старый AAPT, установив нижнюю строку в своей сборке. файл градиента:
android.aaptOptions.useAaptPngCruncher = true
Тем не менее это может привести к той же ошибке, поскольку инструмент AAPT из последней версии SDK также может проверять эту ошибку. Таким образом, у вас есть два варианта:
-
Найдите более старый AAPT, например, < SDK path > /build-tools/17.0.0/aapt, перезапишите текущий SDK AAPT с помощью этого старого. Теперь проблемы с сборкой могут быть решены. Если это не сработает, попробуйте вариант ниже.
-
Напишите простой Bash или Perl script, назовите его "aapt" и поместите его в свою текущую папку инструментов SDK. Этот script будет вызывать старую версию 17 AAPT для вашего * 9.png и использовать новый AAPT для всего остального. См. этот ответ стека переполнение для образца script.
Ответ 4
Чтобы решить эту проблему, убедитесь, что вы заполняете все края черными или красными точками. Это решило мою проблему для всех версий SDK. Если вы не хотите масштабировать вертикально или горизонтально или оба из них, просто заполните все ребра. В этом случае изображение не масштабируется.
Без ошибок
С неверной ошибкой