Intereting Posts
Android selectableItemВыбор выбора Как установить текст над imageView? Пользовательский указатель большого пальца не прозрачен на Lollipop API21 Ошибка в патче Volley Как сохранить базу данных в Arduino? Как предотвратить андроидное приложение от сбоев из-за исключения в фоновом потоке? Как установить расширенные пользовательские атрибуты в файлах Android? Обновления пользовательского интерфейса Threading в Android Retrofit 2.0 отменить объект вызова Как зарегистрировать int на Android? Как подключить javadoc или источники к банкам в папке libs? Java.util.ConcurrentModificationException android после удаления элементов из списка массивов Как запустить (не только установить) приложение для Android с использованием файла .apk? Когда абонентская подписка Google Play автоматически обновляется, она отправляет другое уведомление о покупке (в уведомлении приложения)? Как установить размер и расположение в onSizeChanged?

Android: ошибка выравнивания при создании / показе 9patch изображения

NinePatch:

Изображение корзины значок NinePatch

Скриншот:

Снимок экрана с несоосностью NinePatch

Макет XML:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="#ffffff"> <LinearLayout android:id="@+id/edit_tray" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> <View android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/trash"/> </LinearLayout> </RelativeLayout> 

Желаемые результаты:

«Edit_tray» представляет элемент пользовательского интерфейса, который будет отображаться. Когда режим редактирования выключен, «edit_tray» (и, следовательно, значок корзины) «ушел». Когда режим редактирования находится на «edit_tray», он отображается и накладывается поверх содержимого ScrollView.

Значок корзины имеет два элемента: сам значок и линейный градиент позади него. Изображение NinePatch содержит три растяжимые области и одну статическую область для размещения этих элементов. Значок корзины в середине графика статичен и должен отображаться непосредственно в горизонтальном центре и в нижней части экрана. Градиент должен растягиваться в нижней части экрана с одной стороны на другую.

Баг?

Изображение NinePatch содержит только один пиксель растяжимой области по обе стороны изображения по горизонтали. Эффект от того, что значок корзины появляется непосредственно в центре (1 пиксель с левой стороны == 1 пиксель с правой стороны). Однако, как вы можете видеть на скриншоте выше, это не так. Примечание: этот снимок экрана был взят из моего тестового телефона, T-Mobile G2. Тот же эффект можно увидеть в эмуляторе. Тем не менее, в предварительном просмотре draw9patch и в графическом макете Eclipse изображение отлично распределяется.

Я пробовал несколько разных методов, чтобы попытаться выяснить, где находится ошибка, и попытаться исправить ее или обойти. В том числе: используя ImageViews вместо Views (тот же эффект), используя android: scaleType = «fitXY» (та же проблема), проверяя во время выполнения, что ширина экрана и ширина «edit_tray» одинаковы (они есть), Используя два разных изображения для градиента (как фон edit_tray) и значок (как ImageView src) (создайте еще одну проблему, когда два изображения не были наложены друг на друга. Исправлено установкой абсолютной высоты на обоих) и т. Д.

Ответ, обходной путь и реальный вопрос

Я провел некоторое тестирование с использованием некоторых простых изображений NinePatch с до шести растяжимыми областями на каждую сторону. Я заметил, что были некоторые проблемы, отображающие их, по крайней мере, в одном из тестовых случаев (телефон, эмулятор, draw9patch, графический макет в eclipse).

Я решил попытаться расширить изображение по горизонтали, чтобы было больше линейного градиента, отображаемого на краях значка корзины. Я сделал изображение 128×64 (ранее 64×64). Я сделал больше краев части растяжимой части, чтобы попытаться обуздать любую плохую математику (?), Которая происходила с изображением. Draw9patch сообщил о плохих разделах, поэтому я вернул их только двум пикселям, по одному с обеих сторон. Это сработало! Значок теперь находится прямо в центре экрана! Я не знаю почему, но без изменения фактической растяжимой части изображения, только изменяя ширину изображения до 128, он работает сейчас.

Я попытался изменить размер изображения до 100 пикселей в ширину, чтобы удалить некоторые избыточные пиксели, и ошибка вернулась! Он не только вернулся, но иконка была размещена точно в том же месте, смещенном от центра экрана. Я не могу понять, почему так происходит.

У кого-нибудь есть идеи? Это ошибка?

В настоящее время я работаю с этими обходными решениями, описанными выше, но если у кого-то есть предложения, которые я слушаю.

Solutions Collecting From Web of "Android: ошибка выравнивания при создании / показе 9patch изображения"

Сделайте свой 9-патч-образ с использованием 4 points как я это сделал … и он будет работать.

Введите описание изображения здесь

Советы по созданию 9 патч-изображений . (А не дизайнер, рассказывающий вам мой фонд)

  • Положить очки влево и вверх
  • Если у вас есть текст или изображение между ними. Затем поместите точку слева и справа от изображения и сверху и снизу этого изображения или текста.
  • Всегда смотрите на пустое место слева, а точки с обеих сторон (слева-справа и сверху-снизу) равны.
  • Всегда проверяйте один раз перед просмотром или правой стороной перед использованием проверки в пределах от 2x до 6x

По моему опыту с инструментом 9-патчей для ничьей есть автоматическое смещение 1px на каждой стороне изображения. Учитывая эту информацию, если вы использовали только этот пиксельный сдвиг, ваш образ фактически не растягивался так, как вы себе представляли.

Это можно увидеть из-за того, что, когда вы использовали смещение 2px, он работал идеально.

Кроме того, изображения с 9 патчами имеют тенденцию проявляться в затмении именно так, как вы думаете … но затем появляются разные на телефоне / эмуляторе.

Изучение 9-патч-инструмента – это отличная вещь, так как это позволяет сделать большую настройку. Еще один совет, если вы хотите сделать что-то вроде замены любого андроидного 9-патча своими собственными изменениями, – тогда просто скопируйте 9patch, который существует в SDK, и измените его. По какой-то причине 9-кратные изображения в SDK имеют странные смещения. Выполнение этого гарантирует, что вы не получите странных ответов от ваших 9-патчей. Пример этого – я описываю editText в красном, когда дается плохой ввод.

Изображения SDK можно найти на SDK-> платформах -> [plateform-you-want] -> data-> res-drawable- [you-choice]

Вы также можете посмотреть изображения SDK 9-patch, чтобы понять, как работает 9-патч-инструмент.

Надеюсь, это даст немного больше понимания.

Вот несколько хороших ссылок: http://developer.android.com/guide/developing/tools/draw9patch.html http://android10.org/index.php/articlesother/279-draw-9-patch-tutorial http: //jaanus.com/post/7878186745/how-does-androids-nine-patch-tool-work-from-a

Возможно, это ошибка в графике с девятью патчами или просто ошибка, вызванная округлением .

Однако мне не нравится ваш подход к рисованию этого значка. Вы пытаетесь расположить элемент экрана с помощью чего-то, что не предназначено для этой задачи.

Вы должны сделать это другим способом: создать представление контейнера (FrameLayout) с фоном gradiend. Тогда поверх этой позиции ImageView с корзиной может. Ни одно из этих двух изображений не должно быть девятью патчами, градиент заполняет весь вид, мусор может быть нарисован без масштабирования. Несмотря на то, что в области просмотра корзины есть избыточное число, время процессора не пропадает даром в вычислениях с девятью патчами.

Вы бы использовали систему компоновки для точного позиционирования значка корзины. Разумеется, вы получите ожидаемый результат, так как макеты UI хорошо настроены и предназначены для позиционирования элементов экрана. Изображения с девятью патчами используются для других целей (где пиксели смещены здесь или там немного не имеет значения).

Как сказал @jjNford – это плохая практика работать с изображениями таким образом.

Для этой задачи лучшим решением является создание значка «мусор» с прозрачным фоном и создание shape с градиентом. Таким образом, вы можете удалить ненужный LinearLayout и использовать только ImageView :

 <ImageView android:id="@+id/edit_tray" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:src="@drawable/trash" android:background="@drawable/gradient_background"/> 

Документы для рисования фигуры .

РЕДАКТИРОВАТЬ

Просто проверьте свое изображение – он крахмальный на SE Xperia 2.3.3