Затенение артефакта под ImageView с помощью png с полностью прозрачным фоном - PullRequest
1 голос
/ 05 декабря 2011

Я работаю на устройстве Gingerbread (2.3.3).У меня есть ImageView, который содержит рисунок стрелки и имеет полностью прозрачный фон, который мне нужно нарисовать на некотором фоне.Проблема в том, что под ограничивающей рамкой ImageView находится артефакт «затенения».
Если вы внимательно посмотрите на следующее изображение, вы увидите артефакт, о котором я говорю: 1

Как переднее, так и фоновое изображение имеют альфа-каналы и, следовательно, декодируются как ARGB8888 (я дважды проверил это, вручную расшифровав их ресурсы в растровое изображение, распечатав конфигурацию растрового изображения, которая показала ARGB8888, а затем назначив их соответствующимПросмотры).Я также настроил окно Activitiy на PixelFormat.RGBA_8888 перед вызовом setContentView ().

Пожалуйста, не отсылайте меня на потоки, которые предлагают декодировать растровое изображение как ARGB8888, и / или установите для окна значение RGBA_8888,так как я попробовал оба решения, которые не помогли.

Есть идеи, как я могу решить эту проблему?

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

Вот функциякоторый устанавливает формат пикселя Window и рисованные элементы (вызываемые непосредственно из onCreate ()):

public void testTransparency() {
    getWindow().setFormat(PixelFormat.RGBA_8888);
    setContentView(R.layout.transparency_test);
    LinearLayout ll = (LinearLayout)findViewById(R.id.ll);      
    Bitmap bgBmp = BitmapFactory.decodeResource(getResources(), R.raw.bg);
    Log.d(TAG,"BG BMP Config: " + bgBmp.getConfig());
    ll.setBackgroundDrawable(new BitmapDrawable(bgBmp));
    ImageView iv = (ImageView)findViewById(R.id.iv);
    iv.setBackgroundDrawable(null);
    Bitmap arrowBmp = BitmapFactory.decodeResource(getResources(), R.raw.big_arrow);
    Log.d(TAG,"Arrow BMP Config: " + arrowBmp.getConfig());
    iv.setImageBitmap(arrowBmp);
}

А вот (очень простая) компоновка, которую использует мой тест:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/ll"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical"  
    android:gravity="center">

<ImageView android:id="@+id/iv"
    android:layout_width="72dp"
    android:layout_height="120dp"
    /></LinearLayout>

Ресурс 'bg' можно найти по адресу 2
Ресурс 'big_arrow' можно найти по адресу "http://i.imgur.com/3V6QU.png"

РЕДАКТИРОВАТЬ 2:
Я обнаружил, что не могу воспроизвести проблему ни на эмуляторе, ни на моем N1 (2.3.4) или XOOM (3.2.1). Отсюда продолжаются 2 варианта:
1. Проблема связана с устройством(Android-устройство, над которым я работаю)
2. Существует специфическая проблема с 2.3.4 и 32BPP-фреймом.ebuffer при рендеринге прозрачных PNG друг на друга.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 июля 2013

Простая настройка

BackButton.setBackgroundColor(Color.TRANSPARENT);

решил мою проблему с помощью ImageButton на HTC Desire HD с Android 2.3.5, где мое изображение кнопки имеет меньшую высоту, чем фон по умолчанию. Эмпирическое наблюдение; Артефакт не отображался на Galaxy Note 1 с Android 4.1.2

0 голосов
/ 13 декабря 2011

Нашел ошибку, и действительно, это была ошибка, специфичная для платформы.

Я узнал, когда удаляю неоновые оптимизации в смешанной блиц-части SKIA (в SkBlitRow_D32.cpp - SkBlitRow :: Proc32SkBlitRow :: Factory32 (флаги без знака) ), артефакт затенения исчезает.

Полезный совет для всех, кто хочет отлаживать ошибки такого рода:
Вы всегда можете нарисовать иерархию своего вида врастровое изображение (см .: Android получает растровое изображение перед рисованием? , например), а затем использует метод Bitmap.compress для экспорта растрового изображения в файл PNG.Таким образом, вы можете получить снимок иерархии представления с его альфа-каналом (который не появляется на снимке экрана A DDMS, поскольку он генерируется после компоновки).Таким образом, я обнаружил, что значение альфа в затененной области равно «1» вместо «0», создавая артефакт.

...