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

NinePatch:

Trash can icon NinePatch image

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

Screenshot of NinePatch misalignment

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 содержит только один пиксель растягиваемой области по обе стороны от изображения по горизонтали. Эффект whic h должен быть так, чтобы значок корзины отображался прямо в центре (1 пиксель слева == 1 пиксель справа). Однако, как вы можете видеть на скриншоте выше, это не так. Примечание: этот снимок экрана был сделан с моего тестового телефона T-Mobile G2. Тот же эффект можно увидеть в эмуляторе. Однако в предварительном просмотре draw9patch и графическом макете затмения изображение распределяется идеально.

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

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

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

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

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

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

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

15
задан SubOne 26 June 2012 в 17:54
поделиться