You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何去除indicatif进度条的混合过渡区域?

如何去除indicatif进度条的混合过渡区域?

嘿,我来帮你搞定这个indicatif进度条的过渡色问题!

你遇到的这个浅色过渡区域,其实是indicatif默认的平滑填充效果——当进度条的填充比例不是整数的时候,它会用半色调的混合字符来模拟“部分填充”,让进度看起来更顺滑,但确实会出现你说的那种不纯净的色块。要去掉这个很简单,只要改一下样式模板就行:

核心解决方法:添加solid标记

在你原来的bar样式格式后面加上,solid后缀,告诉indicatif不要使用过渡字符,只渲染完整的实心块。

比如你原来的代码是:

ProgressStyle::with_template("{msg} {bar:40.cyan/blue} [{eta_precise}]").unwrap()

把它改成:

ProgressStyle::with_template("{msg} {bar:40.cyan/blue,solid} [{eta_precise}]").unwrap()

这样修改之后,进度条就会严格按照整数步长来填充,每一块都是纯粹的cyan(已完成)或blue(未完成),完全不会出现中间的浅色过渡区域了。

额外技巧:自定义实心进度字符

如果你还想进一步控制进度条的显示样式,比如用更粗的实心块,还可以搭配progress_chars方法,指定只使用实心和空白两种字符,彻底杜绝过渡的可能:

use indicatif::{ProgressBar, ProgressStyle};

fn main() {
    let pb = ProgressBar::new(100);
    pb.set_style(
        ProgressStyle::with_template("{msg} {bar:40.cyan/blue,solid} [{eta_precise}]")
            .unwrap()
            // 第一个字符是已完成的实心块,第二个是未完成的空白
            .progress_chars("█ "),
    );

    for _ in 0..100 {
        pb.inc(1);
        std::thread::sleep(std::time::Duration::from_millis(50));
    }
    pb.finish_with_message("番茄钟结束!");
}

这个方法特别适合你做番茄钟的场景,进度条干净利落,完全符合你的需求。

内容来源于stack exchange

火山引擎 最新活动