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