2014-05-14 9 views
7

Ich versuche, Bitmap mit Gradienten Alpha unten zu maskieren. Die Gradient-Größe ist fest und unabhängig von der Bitmap-Größe. Aber es zeichnet falsch: unten am oberen Rand, als oben. Was ist los?Wie kann Bitmap mit dem LinearGradient-Shader richtig maskiert werden?

enter image description here

Es gibt Beispielcode:

final int GRADIENT_HEIGHT = 32; 

public Bitmap addGradient(Bitmap src) { 
    int w = src.getWidth(); 
    int h = src.getHeight(); 
    Bitmap overlay = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(overlay); 

    canvas.drawBitmap(src, 0, 0, null); 

    Paint paint = new Paint(); 
    LinearGradient shader = new LinearGradient(0, 0, 0, GRADIENT_HEIGHT, 0xFFFFFFFF, 0x00FFFFFF, TileMode.REPEAT); 
    paint.setShader(shader); 
    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 
    canvas.drawRect(0, h - GRADIENT_HEIGHT, w, h, paint); 

    return overlay; 
} 

Dank!

Antwort

7

Ändern Sie Ihre LinearGradient dazu:

LinearGradient shader = new LinearGradient(0, h - GRADIENT_HEIGHT, 0, h, 0xFFFFFFFF, 0x00FFFFFF, Shader.TileMode.CLAMP); 
+0

Ja, es funktioniert gut. Kannst du bitte deine Antwort erklären? Oder ist es irgendwo dokumentiert? Ich kann nicht finden ... – Ganster41

+1

Auch wenn Ihr DrawRect-Aufruf an der richtigen Stelle gezeichnet wurde, wird die Position des Farbverlaufs nicht neu zugewiesen. Der obere Teil der Box war nicht wie erwartet die Position 0,0 für den Farbverlauf, sondern war immer noch h-GRADIENT_HEIGHT. Der einzige Grund, warum Sie etwas gesehen haben, ist, dass Sie TileMode.REPEAT verwendet haben. – anakin78z