2014-05-14 13 views
7

Tôi đang cố gắng che dấu Bitmap bằng gradient alpha ở dưới cùng. Kích thước Gradient được cố định và không bị ảnh hưởng bởi kích thước Bitmap. Nhưng nó rút ra không chính xác: dưới cùng của gradient ở đầu, hơn đầu trang. Có gì sai?Làm thế nào để che dấu Bitmap bằng LinearGradient shader đúng cách?

enter image description here

Có mẫu mã:

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

Cảm ơn!

Trả lời

7

Thay đổi Gradient Linear của bạn như thế này:

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

tốt Có, nó làm việc. Bạn có thể giải thích câu trả lời của bạn được không? Hoặc có thể nó được ghi lại ở đâu đó? Tôi không thể tìm thấy ... – Ganster41

+1

Mặc dù cuộc gọi drawRect của bạn đang vẽ ở đúng vị trí, nhưng nó không làm thay đổi vị trí của gradient. Vì vậy, đầu của hộp không phải là vị trí 0,0 cho gradient, như bạn mong đợi, nhưng thay vào đó vẫn là h-GRADIENT_HEIGHT. Vì vậy, lý do duy nhất bạn nhìn thấy bất cứ điều gì là bởi vì bạn đang sử dụng TileMode.REPEAT. – anakin78z

Các vấn đề liên quan