2015-11-02 13 views
6

Tôi có chế độ xem tùy chỉnh và trong onDraw(), tôi đang cố gắng thực hiện chế độ xem bitmap. Tôi có một số squareBitmap (màu đỏ) lấp đầy toàn bộ khung nhìn và tôi có một màu circleBitmap (màu xanh dương) hoạt động như mặt nạ. Tôi đang sử dụng chế độ: PorterDuff.Mode.DST_IN.Mặt nạ bitmap của Android (Xfermode) để lại nền đen mờ phía sau

Kết quả tôi mong đợi là vòng kết nối ĐỎ. Tôi nhận được điều đó, nhưng tôi cũng nhận được một nền mờ đục. Tôi không muốn nền mờ đục này, thay vào đó nó phải trong suốt. Figure 1 là kết quả tôi nhận được và Figure 2 là kết quả mà tôi đang tìm kiếm.

Figure 1 : The Result I gotFigure 2: The Result that I am looking for

Mã của tôi: (Tôi đã chuyển tất cả mọi thứ bên trong onDraw() với mục đích của câu hỏi này)

protected void onDraw(Canvas canvas) { 

    final int width = canvas.getWidth(); 
    final int height = canvas.getHeight(); 

    Bitmap circleBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    Canvas circleCanvas = new Canvas(circleBitmap); 
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 
    p.setStyle(Paint.Style.FILL_AND_STROKE); 
    p.setColor(Color.BLUE); 
    circleCanvas.drawCircle(width/2, height/2, width/2, p); 

    p.setColor(Color.RED); 
    Bitmap squareBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas squareCanvas = new Canvas(squareBitmap); 
    final Rect squareRect = new Rect(0, 0, width, height); 
    squareCanvas.drawRect(squareRect, p); 

    Paint q = new Paint(Paint.ANTI_ALIAS_FLAG); 
    canvas.drawBitmap(squareBitmap, 0, 0, q); 
    q.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
    canvas.drawBitmap(circleBitmap, 0, 0, q); 
    q.setXfermode(null); 
} 


tôi đi đâu vậy? Làm thế nào tôi có thể tránh được nền mờ đen này?

+0

Hãy thử 'DST_OUT' thay vì 'DST_IN'. Hoặc 'SRC_IN'. –

+0

@ FrankN.Stein Không, nó không hoạt động. Bây giờ tôi nhận được vòng tròn đầy màu đen và nền đỏ. Nền màu đỏ vì 'squareBitmap', nhưng tại sao vòng tròn màu đen? Lý tưởng nhất là hình tròn phải trong suốt và do đó màu xanh (màu của bố cục nền). – Henry

+0

Bạn sẽ tìm thấy câu trả lời ở đây: http://ssp.impulsetrain.com/porterduff.html –

Trả lời

11

Dường như để hoàn tất việc thực hiện Xfermode, tôi cần chuyển hướng bản vẽ tới bitmap ngoài màn hình. Vì vậy, việc thêm vấn đề sau đã khắc phục được sự cố của tôi.

canvas.saveLayer(0, 0, canvas.getWidth(), canvas.getHeight(), q); 

Nhưng sau đó một lần nữa, documentation của saveLayer nói để tránh sử dụng phương pháp này vì nó là tốn kém. Bạn nên sử dụng harware layer thay vì phương pháp này.

Tránh sử dụng phương pháp này, đặc biệt là nếu các giới hạn cung cấp lớn, hoặc nếu CLIP_TO_LAYER_SAVE_FLAG được bỏ qua từ tham số saveFlags . Bạn nên sử dụng lớp phần cứng trên Chế độ xem để áp dụng bộ lọc màu, bộ lọc màu hoặc alpha, vì nó sẽ thực hiện nhiều hơn tốt hơn phương pháp này.

Do đó, intead của saveLayer phương pháp, tôi đã có thể sửa chữa nó bằng cách thêm những điều sau đây:

setLayerType(LAYER_TYPE_HARDWARE, q); 
+0

bạn có muốn cung cấp ví dụ hoàn chỉnh, hiển thị bitmap vẽ, mặt nạ và lớp đã sử dụng và XferMode không? Cảm ơn! – thumbmunkeys

+1

Mã trong câu hỏi của tôi là ví dụ hoàn chỉnh. Tôi có một lớp mà 'mở rộng View'. Và tôi có phương thức 'onDraw()' mà tôi có trong câu hỏi. Điều duy nhất tôi thêm vào để làm cho nó hoạt động trong câu trả lời: 'setLayerType'. Bạn có thể muốn xem xét điều này cho một kịch bản thế giới thực: http://stackoverflow.com/a/33483600/4747587 – Henry

+0

đó là lời cảm ơn tuyệt vời cho câu trả lời nhanh chóng! – thumbmunkeys

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