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 Graphical Layout изображение идеально распределено.
Я пробовал несколько разных способов, чтобы попытаться выяснить, где находится ошибка, и попытаться исправить ее или обойти ее.,Включая: использование ImageViews вместо Views (тот же эффект), использование android: scaleType = "fitXY" (та же проблема), проверка во время выполнения, что ширина экрана и ширина edit_tray одинаковы (они есть),использование двух разных изображений для градиента (в качестве фона edit_tray) и значка (как для ImageView src) (создайте еще одну проблему, когда два изображения не накладывались друг на друга. Исправлено установкой абсолютной высоты на обоих) и т. д.
Ответ, обходной путь и реальный вопрос
Я провел некоторое тестирование, используя несколько простых изображений NinePatch с до шести растягиваемых областей на стороне.Я заметил, что были некоторые проблемы с отображением их по крайней мере в одном из тестовых случаев (телефон, эмулятор, draw9patch, Graphical Layout в Eclipse).
Я решил попытаться расширить изображение по горизонтали, чтобы было большелинейный градиент, показывающий по краям значок корзины.Я сделал изображение 128х64 (ранее 64х64).Я сделал больше краев частью растягиваемой части, чтобы попытаться обуздать любую плохую математику (?), Которая происходила с изображением.Draw9patch сообщил о плохих сечениях, поэтому я вернул его на два пикселя, по одному с каждой стороны.Это сработало!Значок находится прямо в центре экрана!Я не знаю почему, но не меняя фактическую растягиваемую часть изображения, а только изменяя ширину изображения до 128, она работает сейчас.
Я попытался изменить размер изображения до 100px в ширину, чтобыудалите несколько лишних пикселей и ошибка вернулась!Мало того, что это возвратилось, но значок был помещен в точно то же самое пятно, смещенное от центра экрана.Я не могу понять, почему это произошло именно так.
У кого-нибудь есть идеи?Это ошибка?
В настоящее время у меня есть эта работа с учетом обходных путей, которые я описал выше, но если у кого-то есть какие-либо предложения, я слушаю.