2010-08-26 33 views
19

Theo số original question, Kết quả cuối cùng là một hình tròn png tròn trong một ImageView với bóng thả tự nhiên.Làm cách nào để ngăn drawBitmap của Android chỉ vẽ hình ảnh đen?

Tôi có bóng làm việc, nhưng khi nó vẽ, nó làm cho toàn bộ hình ảnh màu đen.

alt text

Làm thế nào tôi có thể ngăn chặn các hình ảnh ban đầu (chắc chắn không phải màu đen) không bị đen khi thêm cái bóng?

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:

tôi thực hiện đề nghị của Josh về việc sao chép giao cho không gian màu đúng và bây giờ nó hoạt động tuyệt vời! Đối với người tìm kiếm trong tương lai, mã này tạo ra bóng đổ trên chế độ xem hình ảnh. Bạn có thể chơi xung quanh với x và y, cũng như hằng số OUTER để có được hiệu ứng mong muốn.

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

Tuyệt vời! Tôi mừng vì tất cả nỗ lực đó đã được đền đáp. – Josh

+0

Tôi phải làm gì để thay đổi màu của bóng? – Frame91

Trả lời

12

Tôi đã nhận xét trong câu hỏi cuối cùng của bạn, nhưng tại đây lại một lần nữa.

Sự cố có thể là bạn đang vẽ hình ảnh 32 bit (bản gốc) lên hình ảnh 8 bit (hình ảnh trích xuất). Nếu trường hợp đó xảy ra, hãy làm một cái gì đó như

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

sau khi trích xuấtAlpha gọi và vẽ lên chàng đó thay vì shadowImage 8 bit.

3

Bạn phải vẽ cả hình ảnh bóng và hình ảnh ban đầu. Hình ảnh bóng chỉ chứa các giá trị alpha của hình ảnh gốc chứ không phải các pixel màu thực tế.

+0

Điều đó không xảy ra trên dòng c.drawBitmap? Tôi nghĩ rằng tôi đang vẽ bản gốcBitmap lên canvas với shadowImage. Bạn có thể làm rõ với mã? – coneybeare

+3

Không, anh ta không thể. Anh ấy quá bận rộn khi viết 1 câu trả lời và phá vỡ Android để thực sự quan tâm đến những gì một nhà phát triển sẽ cần. – StackOverflowed

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