2014-04-08 30 views
5

Tôi đang viết thanh tiến trình tùy chỉnh. Tôi muốn tạo ra một hiệu ứng tương tự nhưĐảo ngược màu sơn dựa trên nền

enter image description here

nơi những thay đổi "50%" màu chữ động sang màu trắng trong khi thanh màu đen tiến triển đúng đắn. Có thể sử dụng các giải pháp "đơn giản" không? Tôi nhìn lên PorterDuff, ColorFilters, xFermodes, không có gì có vẻ hiệu quả. Bất kỳ ý tưởng? ATM mã của tôi trông sth như thế này:

Rect r = new Rect(1, 1, m_width-1, m_height-1); 
    canvas.drawRect(r, pWhiteFill); 
    r = new Rect(1, 1, progressWidth, m_height-1); 
    canvas.drawRect(r, pBlackFill);  
    canvas.drawText(String.valueOf(progress)+"%", m_width/2, m_height/2, pBlackTxtM); 

Có cách nào để sửa đổi pBlackTxtM sơn để thay đổi màu sắc dựa trên whats vẽ bên dưới nó trên vải '?

Trả lời

3

Ngay cả khi câu hỏi khá cũ, tôi muốn chia sẻ giải pháp cho vấn đề này.

Bạn không thể thực hiện việc này bằng cách sử dụng "đảo ngược" Paint, nhưng bạn có thể đạt được điều đó bằng cách cắt bớt.

Ý tưởng là vẽ văn bản hai lần, một lần bằng màu đen và một lần bằng màu trắng, trong khi đặt vùng cắt để khớp với phần tương ứng của thanh.

Dưới đây là một số mã để phác thảo ý tưởng:

// store the state of the canvas, so we can restore any previous clipping 
canvas.save(); 

// note that it's a bad idea to create the Rect during the drawing operation, better do that only once in advance 
// also note that it might be sufficient and faster to draw only the white part of the bar 
Rect r = new Rect(1, 1, m_width-1, m_height-1); 
canvas.drawRect(r, pWhiteFill); 

// this Rect should be created when the progress is set, not on every drawing operation 
Rect r_black = new Rect(1, 1, progressWidth, m_height-1); 
canvas.drawRect(r_black, pBlackFill); 

// set the clipping region to the black part of the bar and draw the text using white ink 
String text = String.valueOf(progress)+"%"; 
canvas.cliprect(r_black); 
canvas.drawText(text, m_width/2, m_height/2, pWhiteTxtM); 

// draw the same text again using black ink, setting the clipping region to the complementary part of the bar 
canvas.clipRect(r, Region.Op.XOR); 
canvas.drawText(text, m_width/2, m_height/2, pBlackTxtM); 

canvas.restore(); 
Các vấn đề liên quan