Sombrear artefacto debajo de una vista de imagen con un PNG que tiene fondo totalmente transparente

StackOverflow https://stackoverflow.com/questions/8386458

Pregunta

Estoy trabajando en un dispositivo de pan de jengibre (2.3.3). Tengo una vista de imagen que contiene una figura de flecha y tengo un fondo completamente transparente que necesito dibujar en algún fondo. El problema es que hay un artefacto de "sombreado" debajo del cuadro delimitador de ImageView.
Si miras de cerca la siguiente imagen, verás el artefacto del que estoy hablando: 1

Tanto la imagen en primer plano como la imagen de fondo tienen canales alfa y, por lo tanto, se decodifican como ArgB8888 (lo verifiqué dos veces decodificando manualmente sus recursos en un mapa de bits, imprima la configuración de mapa de bits que mostró ArgB8888 y luego asignándolos a sus respectivas vistas). También configuré la ventana de Activitiy para que sea PixFormat.rgba_8888 antes de la llamada a SetContentView ().

Por favor, no me remita a los hilos que sugieren decodificar el mapa de bits como argb8888 y/o configurar la ventana como rgba_8888, ya que probé ambas soluciones, lo que no ayudó.

Alguna idea ¿Cómo puedo solucionar este problema?

EDITAR:

Aquí está la función que establece el formato de píxel de la ventana y los dibujables (llamado directamente desde 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);
}

Y aquí está el diseño (muy simple) que mi prueba está usando:

<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>

El recurso 'BG' se puede encontrar en 2
El recurso 'big_arrow' se puede encontrar en "http://i.imgur.com/3v6qu.png"

Editar 2:
Descubrí que no puedo reproducir el problema en el emulador, ni en mi N1 (2.3.4) o Xoom (3.2.1). Hay 2 opciones que continúan desde aquí:
1. El problema es específico del dispositivo (el dispositivo basado en Android estoy trabajando)
2. Hay un problema específico con FrameBuffer de 2.3.4 y 32bpp mientras se convierte en PNG transparentes uno encima del otro.

Gracias.

¿Fue útil?

Solución

Encontré el error y, de hecho, era un error específico de la plataforma.

Descubrí cuando elimino las optimizaciones de neón en la porción de bombardeo combinado de Skia (en skblitrow_d32.cpp - Skblitrow :: PROC32 SKBLITROW :: Factory32 (banderas sin firmar)), el artefacto de sombreado desaparece.

Un consejo útil para cualquiera que quiera depurar este tipo de errores:
Siempre puedes dibujar tu jerarquía de vista a un mapa de bits (ver: ¿Android obtiene una mapa de bits antes de dibujar? por ejemplo) y luego usa Bitmap.compress Método para exportar el mapa de bits a un archivo PNG. De esta manera, puede obtener su instantánea de jerarquía de vista con su canal alfa (que no aparece en una captura de pantalla DDMS ya que se genera después de la composición). Descubrí de esta manera que el valor alfa dentro del área sombreada es '1' en lugar de '0', creando el artefacto.

Otros consejos

Simplemente configurando

BackButton.setBackgroundColor(Color.TRANSPARENT);

Resolví mi problema con un Button Image en un HTC Desire HD con Android 2.3.5 donde mi imagen de botón tiene menos altura que el fondo predeterminado. Observación empírica; Artifact no se mostró en un Galaxy Note 1 con Android 4.1.2

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top