Девять Патч:

Снимок экрана:

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 пикселей в ширину, чтобы удалить некоторые лишние пиксели, и ошибка вернулась! Он не только вернулся, но и значок был размещен точно в том же месте, смещенном от центра экрана. Я не могу понять, почему это произошло именно так.
У кого-нибудь есть идеи? Это ошибка?
В настоящее время у меня есть эта работа, учитывая обходные пути, которые я описал выше, но если у кого-то есть какие-либо предложения, я слушаю.
