2010-08-26 32 views
19

Wie die original question, Das Endergebnis ist eine abgerundete Rect png in einem ImageView mit einem natürlich aussehenden Schlagschatten.Wie verhindert man, dass Android drawBitmap nur schwarze Bilder zeichnet?

Ich habe den Schatten arbeiten, aber wenn es zeichnet, macht es das gesamte Bild schwarz.

alt text

Wie kann ich verhindern, dass das Originalbild (definitiv nicht schwarz) von schwarz zu sein, wenn die Schatten hinzufügen?

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





UPDATE:

ich Josh Vorschlag über das Kopieren von über auf den richtigen Farbraum umgesetzt und jetzt funktioniert es super! Für zukünftige Sucher, , erzeugt dieser Code einen Schlagschatten in einer Bildansicht. Sie können mit den X- und Y- sowie der OUTER-Konstante spielen, um den gewünschten Effekt zu erzielen.

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

Super! Ich bin froh, dass sich diese Mühe gelohnt hat. – Josh

+0

Was muss ich tun, um die Farbe des Schattens zu ändern? – Frame91

Antwort

12

Ich habe in Ihrer letzten Frage kommentiert, aber hier ist es wieder.

Das Problem könnte sein, dass Sie ein 32-Bit-Bild (das Original) auf ein 8-Bit-Bild (das extrahierte shadowImage) zeichnen. Wenn das der Fall ist, so etwas wie

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

nach dem extractAlpha Anruf, und zieht auf diesen Kerl anstelle der 8-Bit-ShadowImageTM.

3

Sie haben sowohl das Schattenbild und das Originalbild zu zeichnen. Das Schattenbild enthält nur die Alpha-Werte des Originalbildes, nicht die tatsächlichen farbigen Pixel.

+0

Passiert das nicht in der Zeile c.drawBitmap? Ich dachte, ich zeichne die ursprüngliche Bitmap mit shadowImage auf die Leinwand. Kannst du mit Code klären? – coneybeare

+3

Nein, kann er nicht. Er ist zu sehr damit beschäftigt, 1-Zeilen-Antworten zu schreiben und Android zu brechen, um sich wirklich darum zu kümmern, was ein Entwickler benötigen würde. – StackOverflowed

Verwandte Themen