Artefact d'ombrage sous un ImageView avec un png avec un arrière-plan entièrement transparent

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

Question

Je travaille sur un appareil Gingerbread (2.3.3). J'ai un ImageView qui contient une flèche et un arrière-plan entièrement transparent que je dois dessiner sur un arrière-plan. Le problème est qu'il y a un artefact "d'ombrage" sous le cadre de délimitation de ImageView.
Si vous regardez attentivement l'image suivante, vous verrez l'artefact dont je parle: 1

L'image de premier plan et l'image d'arrière-plan ont des canaux alpha et sont donc décodées comme ARGB8888 (j'ai vérifié deux fois cela en décodant manuellement leurs ressources dans un bitmap, imprimez la configuration bitmap qui montrait ARGB8888, puis en les affectant à leurs vues). J'ai également configuré la fenêtre d'Activitiy sur PixelFormat.RGBA_8888 avant l'appel à setContentView ().

Veuillez ne pas me référer aux fils qui suggèrent de décoder le bitmap en ARGB8888 et / ou de définir la fenêtre sur RGBA_8888, car j'ai essayé les deux solutions, ce qui n'a pas aidé.

Des idées pour résoudre ce problème?

< EDIT:

Voici la fonction qui définit le format des pixels de la fenêtre et les dessinables (appelés directement depuis 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);
}

Et voici la mise en page (très simple) que mon test utilise:

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

La ressource "bg" se trouve à l'adresse 2
La ressource 'big_arrow' peut être trouvée sur "http://i.imgur.com/3V6QU.png"

MODIFIER 2:
J'ai découvert que je ne pouvais pas reproduire le problème sur l'émulateur, ni sur mon N1 (2.3.4) ou XOOM (3.2.1). Il y a 2 options à partir d'ici:
1. Le problème est spécifique à l'appareil (appareil basé sur Android sur lequel je travaille)
2. Il y a un problème spécifique avec le framebuffer 2.3.4 et 32BPP lors du rendu des PNG transparents les uns sur les autres.

Merci.

Était-ce utile?

La solution

J'ai trouvé le bogue et en fait c'était un bogue spécifique à la plate-forme.

J'ai découvert que lorsque j'ai supprimé les optimisations de néon dans la partie blitting mélangée de SKIA (dans SkBlitRow_D32.cpp - SkBlitRow :: Proc32 SkBlitRow :: Factory32 (indicateurs non signés) ), l'artefact d'ombrage disparaît.

Un conseil utile pour quiconque souhaite déboguer ce type de bogues:
Vous pouvez toujours dessiner votre hiérarchie de vues sur un bitmap (voir: Androidobtenir un bitmap d'une vue avant de dessiner? par exemple) puis utilisez la méthode Bitmap.compress pour exporter le bitmap vers un fichier PNG.De cette façon, vous pouvez obtenir un instantané de votre hiérarchie de vues avec son canal alpha (qui n'apparaît pas dans une capture d'écran DDMS car il est généré après la composition).J'ai découvert de cette façon que la valeur alpha dans la zone ombrée est «1» au lieu de «0», créant l'artefact.

Autres conseils

Réglage simple

BackButton.setBackgroundColor(Color.TRANSPARENT);

a résolu mon problème avec un ImageButton sur un HTC Desire HD avec Android 2.3.5 où l'image de mon bouton a moins de hauteur que l'arrière-plan par défaut.Observation empirique;l'artefact ne s'est pas affiché sur un Galaxy Note 1 avec Android 4.1.2

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top