2010-08-26 7 views
19

Selon le original question, le résultat final est arrondi-rect png dans un ImageView avec une ombre portée d'aspect naturel.Comment empêcher DrawBitmap d'Android de ne dessiner que des images noires?

J'ai l'ombre qui fonctionne, mais quand elle dessine, elle noircit l'image entière.

alt text

Comment puis-je éviter l'image d'origine (certainement pas noir) d'être noir lors de l'ajout de l'ombre?

BlurMaskFilter blurFilter = new BlurMaskFilter(2, BlurMaskFilter.Blur.OUTER); 
    Paint shadowPaint = new Paint(); 
    shadowPaint.setMaskFilter(blurFilter); 

    int[] offsetXY = new int[2]; 
    Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pier_t); 
    Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY); 

    Canvas c = new Canvas(shadowImage); 
    c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null); 

    imageView.setImageBitmap(shadowImage); 





MISE À JOUR:

Je mis en œuvre la suggestion de Josh sur la copie sur l'espace de couleur correcte et maintenant il fonctionne très bien! Pour les futurs chercheurs, , ce code génère une ombre portée sur une vue d'image. Vous pouvez jouer avec les x et y, ainsi qu'avec la constante OUTER pour obtenir l'effet désiré.

BlurMaskFilter blurFilter = new BlurMaskFilter(2, BlurMaskFilter.Blur.OUTER); 
Paint shadowPaint = new Paint(); 
shadowPaint.setMaskFilter(blurFilter); 

int[] offsetXY = new int[2]; 
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pier_t); 
Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY); 
Bitmap shadowImage32 = shadowImage.copy(Bitmap.Config.ARGB_8888, true); 

Canvas c = new Canvas(shadowImage32); 
c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null); 

imageView.setImageBitmap(shadowImage32); 

alt text

+0

Génial! Je suis content que tout cet effort ait été payant. – Josh

+0

Que dois-je faire pour changer la couleur de l'ombre? – Frame91

Répondre

12

J'ai commenté votre dernière question, mais la voici à nouveau. Le problème peut être que vous dessinez une image 32 bits (l'original) sur une image 8 bits (l'image shadowImage extraite). Si tel est le cas, faire quelque chose comme

Bitmap shadowImage32 = shadowImage.copy(ARGB_8888, true); 

après l'appel extractAlpha, et tirer sur ce gars-là au lieu du shadowImage 8 bits.

3

Vous avez à la fois dessiner l'image d'ombre et l'image originale. L'image de l'ombre contient uniquement les valeurs alpha de l'image d'origine, pas les pixels de couleur réels.

+0

Cela ne se passe-t-il pas sur la ligne c.drawBitmap? J'ai pensé que je dessine l'originalBitmap sur la toile avec le shadowImage. Pouvez-vous clarifier avec le code? – coneybeare

+3

Non, il ne peut pas. Il est trop occupé à écrire des réponses en ligne et à casser Android pour se soucier vraiment de ce dont un développeur aurait besoin. – StackOverflowed

Questions connexes