IT源码网

android之根据背景反转油漆颜色

powertoolsteam 2025年01月19日 程序员 15 0

我正在编写一个自定义进度条。我想创建类似于

的效果

其中“50%”文本颜色动态更改为白色,而黑色条向右移动。使用“简单”的解决方案可能吗?我查阅了 PorterDuff、ColorFilters、xFermodes,似乎没有任何效果。有任何想法吗? ATM 我的代码看起来像这样:

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

有没有办法修改 pBlackTxtM 绘画以根据其下方“ Canvas ”上绘制的内容更改颜色?

请您参考如下方法:

即使这个问题很老,我也想分享这个问题的解决方案。

您无法使用“反转”Paint 来实现此目的,但可以使用剪切来实现。

这个想法是绘制文本两次,一次为黑色,一次为白色,同时设置剪切区域以匹配栏的相应部分。

这里有一些代码来概述这个想法:

// 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(); 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!