我的编程空间,编程开发者的网络收藏夹
学习永远不晚

利用Matlab绘制一款专属进度条

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用Matlab绘制一款专属进度条

1.使用效果

2.制作历程

首先我有个程序需要用到进度条,我首先试了一下MATLAB自带的进度条:

bar=waitbar(0,'读取数据中...');    % waitbar显示进度条

for i=1:1000
    A(i)=rand();
    str=['计算中...',num2str(100*i/1000),'%'];   % 显示的文本
    waitbar(i/1000,bar,str)                       
end

但是这样的进度条显得冷冰冰的,我就想研究一下其属性来想办法看能否对其修饰。

以前的版本系统自带的进度条可以通过。

set(findobj('type','patch'),'facecolor','b')

这样的方式改变颜色,但是慢慢的随着版本更新,这样的修改方式已经不行了,于是我便尝试查看新版本 waitbar 是怎样刷新进度条的,我进行了一波 open waitbar 发现这个函数就只是创建了figure和axes并不断更新图像:

其中更新图像主要依赖一个名为 uiwaitbar 的函数:

于是我想当然的试了一下 open uiwaitbar 结果发现打不开。。。

于是我根据 waitbar.m 的位置顺藤摸瓜的在:toolbox\matlab\uitools\private

路径找到了 uiwaitbar.p 文件,啊加密文件,那没事了嗷:

虽然是加密文件,但我们还是通过换着参数调用发现这个函数可能需要用到一些png或者css文件:

不过本人css用的确实不够熟,同时也比较难看出加密文件到底是怎么调用css文件的,但是总结来说waitbar就只是一个不断刷新图像的figure而已,我们自己写的话甚至可以不用css或者png,直接用自带的画图函数都可以。

3.函数用法

写了以下几个进度条函数(四种风格):

  • waitBar_SL1.m(仅支持英文)
  • waitBar_SL2.m
  • waitBar_SL3.m
  • waitBar_SL4.m

基本用法like this:

bar=waitBar_SL2(0,'loading ...');  % 初始化

for i=1:1000
    A(i)=rand();
    str=['precess - ',num2str(round(i/10)),'%']; % 显示的文本
    waitBar_SL2(bar,i/1000,str);
end

4.工具函数完整代码

waitBar_SL1.m

function barHdl=waitBar_SL1(varargin)
% @author:slandarer
%
% try this Code:
% --------------------------
% bar=waitBar_SL1(0,'loading ...');  % 初始化
% 
% len=1000;
% for i=1:len
%     A(i)=rand();
%     str=['progress - ',num2str(round(i/len*100)),'%']; % 显示的文本
%     waitBar_SL1(bar,i/len,str);
% end

% 第一次调用先创建figure和axes
if ~strcmp(get(varargin{1},'type'),'figure')
    screenSize=get(0,'ScreenSize');
    width=screenSize(3)*0.24;
    height=screenSize(4)*0.12;
    pos=[screenSize(3)/2-width/2 screenSize(4)/2-height/2 width height];
    barHdl=figure();
    barHdl.Position=pos;
    barHdl.Resize='off';
    barHdl.Name='waitbar-slandarer-type1';
    barHdl.NumberTitle='off';
    barHdl.IntegerHandle='off';
    barHdl.MenuBar='none';
    barHdl.Interruptible='off';
    barHdl.DockControls='off';
    
    barAx=axes('Parent',barHdl);
    barAx.Position=[0 0 1,1];
    barAx.Color=[0.99 0.96 0.95];
    barAx.XColor='none';
    barAx.YColor='none';
    barAx.XLim=[0,105];
    barAx.YLim=[0,60];
    barAx.XGrid='on';
    barAx.YGrid='on';
    barAx.XTick=0:5:105;
    barAx.YTick=0:5:60;
    barAx.GridColor=[0.71 0.78 0.86];
    barAx.GridAlpha=0.3;
    barAx.LineWidth=1.2;
    hold(barAx,'on')
    
    
    rectangle(barAx,'Position',[0 0 105 38],'Curvature',0.3,'FaceColor',[0.4 0.5 1 .2],...
        'LineWidth',1.5,'EdgeColor',[0.16 0.15 0.65],'AlignVertexCenters','on')
    rectangle(barAx,'Position',[2.5 4 100 30],'Curvature',0.1,'FaceColor',[1 1 1 .8],...
        'LineWidth',1.5,'EdgeColor',[0.16 0.15 0.65],'AlignVertexCenters','on')
    barAx.UserData.Title=text(barAx,105/2,50,varargin{2},'horizontalAlignment','center',...
        'FontSize',14,'FontWeight','bold','FontName','Comic Sans MS','Color',[0.16 0.15 0.65]);
    barAx.UserData.RateHdl=plot(barAx,[],[],'Color',[0.16 0.15 0.65],'LineWidth',2,'Tag','rateHdl');
    drawnow
else
    barHdl=varargin{1};
    barAx=barHdl.Children;
    barAx.UserData.Title.String=varargin{3};
    rate=round(varargin{2}*100/5);
    if rate>0
        X=(1:rate).*5;
        Y=ones(1,rate);
        XSet=[X-2.5;X+2.5];
        YSet=[Y.*4.5;Y.*33.5];
        delete(findobj('Tag','rateHdl'));
        barAx.UserData.RateHdl=plot(barAx,XSet,YSet,'Color',[0.16 0.15 0.65],'LineWidth',2,'Tag','rateHdl');
    end
    drawnow
end 
end

waitBar_SL2.m

function barHdl=waitBar_SL2(varargin)
% @author:slandarer
%
% try this Code:
% --------------------------
% bar=waitBar_SL2(0,'loading ...');  % 初始化
% 
% len=1000;
% for i=1:len
%     A(i)=rand();
%     str=['progress - ',num2str(round(i/len*100)),'%']; % 显示的文本
%     waitBar_SL2(bar,i/len,str);
% end

xyMin=[5,10];
xyMax=[95,25];
% 第一次调用先创建figure和axes
if ~strcmp(get(varargin{1},'type'),'figure')
    screenSize=get(0,'ScreenSize');
    width=screenSize(3)*0.24;
    height=screenSize(4)*0.12;
    pos=[screenSize(3)/2-width/2 screenSize(4)/2-height/2 width height];
    barHdl=figure();
    barHdl.Position=pos;
    barHdl.Resize='off';
    barHdl.Name='waitbar-slandarer-type2';
    barHdl.NumberTitle='off';
    barHdl.IntegerHandle='off';
    barHdl.MenuBar='none';
    barHdl.Interruptible='off';
    barHdl.DockControls='off';
    
    barAx=axes('Parent',barHdl);
    barAx.Position=[0 0 1,1];
    barAx.Color=[0.99 0.96 0.95];
    barAx.XColor='none';
    barAx.YColor='none';
    barAx.XLim=[0,100];
    barAx.YLim=[0,50];
    hold(barAx,'on')
    
    
    %0.8200    0.3300    0.1200
    fill(barAx,[xyMin(1),xyMax(1),xyMax(1),xyMin(1)],...
               [xyMin(2),xyMin(2),xyMax(2),xyMax(2)],[0.85 0.4 0.13].*1.1);
    xSep1=5;
    xSep2=3;
    for i=1:9
        fill(barAx,[xyMin(1),xyMin(1)+xSep1,xyMin(1)+xSep1+xSep2,xyMin(1)+xSep2]+(i-1)*10.2,...
                   [xyMin(2),xyMin(2),xyMax(2),xyMax(2)],[0.82 0.33 0.12],'EdgeColor','none')
    end
    
    barAx.UserData.Title=text(barAx,5,37.5,varargin{2},'horizontalAlignment','left',...
        'FontSize',14,'FontWeight','bold','Color',[0.2 0.2 0.2]);
    barAx.UserData.RateHdl=fill(barAx,[xyMin(1),xyMax(1),xyMax(1),xyMin(1)],...
                                      [xyMin(2),xyMin(2),xyMax(2),xyMax(2)],...
                                      [0.99 0.96 0.95],'EdgeColor','none');
    plot(barAx,[xyMin(1),xyMin(1)]-0.8,[xyMin(2),xyMax(2)],'Color',[0.2,0.2,0.2],'LineWidth',3)
    plot(barAx,[xyMax(1),xyMax(1)]+0.8,[xyMin(2),xyMax(2)],'Color',[0.2,0.2,0.2],'LineWidth',3)
    plot(barAx,[xyMin(1),xyMax(1)],[xyMin(2),xyMin(2)]-1,'Color',[0.2,0.2,0.2],'LineWidth',3)
    plot(barAx,[xyMin(1),xyMax(1)],[xyMax(2),xyMax(2)]+1,'Color',[0.2,0.2,0.2],'LineWidth',3)
    drawnow
else
    barHdl=varargin{1};
    barAx=barHdl.Children;
    barAx.UserData.Title.String=varargin{3};
    rate=varargin{2};
    xMin=rate*(xyMax(1)-xyMin(1))+xyMin(1);
    barAx.UserData.RateHdl.XData=[xMin,xyMax(1),xyMax(1),xMin];
    drawnow
end
end

waitBar_SL3.m

function barHdl=waitBar_SL3(varargin)
% @author:slandarer
%
% try this Code:
% --------------------------
% bar=waitBar_SL3(0,'loading ...');  % 初始化
% 
% len=1000;
% for i=1:len
%     A(i)=rand();
%     str=['progress - ',num2str(round(i/len*100)),'%']; % 显示的文本
%     waitBar_SL3(bar,i/len,str);
% end

xyMin=[5,10];
xyMax=[95,25];
% 第一次调用先创建figure和axes
if ~strcmp(get(varargin{1},'type'),'figure')
    screenSize=get(0,'ScreenSize');
    width=screenSize(3)*0.24;
    height=screenSize(4)*0.12;
    pos=[screenSize(3)/2-width/2 screenSize(4)/2-height/2 width height];
    barHdl=figure();
    barHdl.Position=pos;
    barHdl.Resize='off';
    barHdl.Name='waitbar-slandarer-type3';
    barHdl.NumberTitle='off';
    barHdl.IntegerHandle='off';
    barHdl.MenuBar='none';
    barHdl.Interruptible='off';
    barHdl.DockControls='off';
    
    barAx=axes('Parent',barHdl);
    barAx.Position=[0 0 1,1];
    barAx.Color=[0.99 0.96 0.95];
    barAx.XColor='none';
    barAx.YColor='none';
    barAx.XLim=[0,100];
    barAx.YLim=[0,50];
    hold(barAx,'on')
    
    
    %0.8200    0.3300    0.1200
    fill(barAx,[xyMin(1),xyMax(1),xyMax(1),xyMin(1)],...
               [xyMin(2),xyMin(2),xyMax(2),xyMax(2)],[0.4100 0.6200 0.15].*1.3);
    xSep1=5;
    xSep2=3;
    for i=1:9
        fill(barAx,[xyMin(1),xyMin(1)+xSep1,xyMin(1)+xSep1+xSep2,xyMin(1)+xSep2]+(i-1)*10.2,...
                   [xyMin(2),xyMin(2),xyMax(2),xyMax(2)],[0.47 0.66 0.12],'EdgeColor','none')
    end
    
    barAx.UserData.Title=text(barAx,5,37.5,varargin{2},'horizontalAlignment','left',...
        'FontSize',14,'FontWeight','bold','Color',[0.2 0.2 0.2]);
    barAx.UserData.RateHdl=fill(barAx,[xyMin(1),xyMax(1),xyMax(1),xyMin(1)],...
                                      [xyMin(2),xyMin(2),xyMax(2),xyMax(2)],...
                                      [0.99 0.96 0.95],'EdgeColor','none');
    plot(barAx,[xyMin(1),xyMin(1)]-0.8,[xyMin(2),xyMax(2)],'Color',[0.2,0.2,0.2],'LineWidth',3)
    plot(barAx,[xyMax(1),xyMax(1)]+0.8,[xyMin(2),xyMax(2)],'Color',[0.2,0.2,0.2],'LineWidth',3)
    plot(barAx,[xyMin(1),xyMax(1)],[xyMin(2),xyMin(2)]-1,'Color',[0.2,0.2,0.2],'LineWidth',3)
    plot(barAx,[xyMin(1),xyMax(1)],[xyMax(2),xyMax(2)]+1,'Color',[0.2,0.2,0.2],'LineWidth',3)
    drawnow
else
    barHdl=varargin{1};
    barAx=barHdl.Children;
    barAx.UserData.Title.String=varargin{3};
    rate=varargin{2};
    xMin=rate*(xyMax(1)-xyMin(1))+xyMin(1);
    barAx.UserData.RateHdl.XData=[xMin,xyMax(1),xyMax(1),xMin];
    drawnow
end
end

waitBar_SL4.m

function barHdl=waitBar_SL4(varargin)
% @author:slandarer
%
% try this Code:
% --------------------------
% bar=waitBar_SL4(0,'loading ...');  % 初始化
% 
% len=1000;
% for i=1:len
%     A(i)=rand();
%     str=['progress - ',num2str(round(i/len*100)),'%']; % 显示的文本
%     waitBar_SL4(bar,i/len,str);
% end


% 第一次调用先创建figure和axes
if ~strcmp(get(varargin{1},'type'),'figure')
    screenSize=get(0,'ScreenSize');
    width=screenSize(3)*0.18;
    height=screenSize(3)*0.18;
    pos=[screenSize(3)/2-width/2 screenSize(4)/2-height/2 width height];
    barHdl=figure();
    barHdl.Position=pos;
    barHdl.Resize='off';
    barHdl.Name='waitbar-type4';
    barHdl.NumberTitle='off';
    barHdl.IntegerHandle='off';
    barHdl.MenuBar='none';
    barHdl.Interruptible='off';
    barHdl.DockControls='off';
    
    barAx=axes('Parent',barHdl);
    barAx.Position=[0 0 1,1];
    barAx.Color=[1 1 1];
    barAx.XColor='none';
    barAx.YColor='none';
    barAx.XLim=[0,100];
    barAx.YLim=[0,100];
    hold(barAx,'on')
    
    t=linspace(0,-2*pi,pi/(pi/500))+pi/2;
    xSet=cos(t);
    ySet=sin(t);
    fill(barAx,[xSet.*35,xSet(end:-1:1).*45]+50,...
               [ySet.*35,ySet(end:-1:1).*45]+50,[1 1 1].*0.93,'EdgeColor','none');
    barAx.UserData.Title=text(barAx,50,50,varargin{2},'horizontalAlignment','center',...
        'FontSize',14,'FontWeight','bold','Color',[0.2 0.2 0.2]);
    barAx.UserData.RateHdl=fill(barAx,[0 0 0 0],...
                                      [0 0 0 0],...
                                      [0.53 0.81 0.93],'EdgeColor','none');
    drawnow
else
    barHdl=varargin{1};
    barAx=barHdl.Children;
    barAx.UserData.Title.String=varargin{3};
    rate=varargin{2}*2*pi;
    t=linspace(0,-rate,rate/(pi/500))+pi/2;
    xSet=cos(t);
    ySet=sin(t);
    barAx.UserData.RateHdl.XData=[xSet.*35,xSet(end:-1:1).*45]+50;
    barAx.UserData.RateHdl.YData=[ySet.*35,ySet(end:-1:1).*45]+50;
    drawnow
end
end

5.下载地址

 完整文件及素材

以上就是利用Matlab绘制一款专属进度条的详细内容,更多关于Matlab进度条的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

利用Matlab绘制一款专属进度条

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

在android应用中利用WebView制作一个进度条

本篇文章为大家展示了在android应用中利用WebView制作一个进度条,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、进度条的位置问题 进度条加载完成后消失,是invisible还是gone掉
2023-05-31

使用Canvas怎么绘制一个未闭合的带进度条圆环

这期内容当中小编将会给大家带来有关使用Canvas怎么绘制一个未闭合的带进度条圆环,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、定义变量定义半径,定义圆环厚度,定义圆心位置、定义默认填充颜色let r
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录