服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 利用Matlab绘制一款专属进度条

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

2022-10-07 16:16slandarer C/C++

MATLAB自带的进度条是很简单的,这样的进度条显得冷冰冰的。因此,本文将用Matlab来DIY一款专属的进度条,感兴趣的小伙伴可以了解一下

1.使用效果

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

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

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

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

 

2.制作历程

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

不过本人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

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

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

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

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

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

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

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

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进度条的资料请关注服务器之家其它相关文章!

原文链接:https://mp.weixin.qq.com/s/mQ59uWK1340R5hVCoj293Q

延伸 · 阅读

精彩推荐
  • C/C++C++存储方案和动态分配

    C++存储方案和动态分配

    这篇文章主要介绍了C++存储方案和动态分配,下面来看文章对此的详细介绍吧,需要的小伙伴可以参考一下...

    Coder梁(ID:Coder_LT)10592022-08-04
  • C/C++Qt 仪表盘的实现示例

    Qt 仪表盘的实现示例

    仪表盘在很多汽车和物联网相关的系统中很常用,本文就来介绍一下Qt 仪表盘的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴...

    feiyangqingyun7342022-07-20
  • C/C++手把手带你学习C++的运算符

    手把手带你学习C++的运算符

    这篇文章主要为大家介绍了C++运算符,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助,希望能够给你带来帮助...

    Eric_Yihan8982022-03-02
  • C/C++一篇文章带你了解C语言二分查找

    一篇文章带你了解C语言二分查找

    这篇文章主要为大家详细介绍了C语言二分查找法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    ZDDWLIG10972021-12-22
  • C/C++C语言数据结构算法之实现快速傅立叶变换

    C语言数据结构算法之实现快速傅立叶变换

    这篇文章主要介绍了C语言数据结构算法之实现快速傅立叶变换的相关资料,需要的朋友可以参考下...

    okbase5172021-05-19
  • C/C++C++实现区块链的源码

    C++实现区块链的源码

    这篇文章主要介绍了C++实现区块链的源码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    程序小黑12652021-10-20
  • C/C++C++ 函数的介绍

    C++ 函数的介绍

    本篇主要介绍了函数的基础概念以及一些特殊的函数方法和类型,函数重载以及函数指针,下面一起进入文章学习详细的内容吧,需要的朋友也可以参考一下...

    一个热爱学习的深度渣渣10102022-03-10
  • C/C++C语言中循环语句练习实例

    C语言中循环语句练习实例

    大家好,本篇文章主要讲的是C语言中循环语句练习实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下...

    Ll_R_lL6442022-08-28