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

目录
  • 1.使用效果
  • 2.制作历程
  • 3.函数用法
  • 4.工具函数完整代码
    • waitBar_SL1.m
    • waitBar_SL2.m
    • waitBar_SL3.m
    • waitBar_SL4.m
  • 5.下载地址

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进度条的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python实现实时显示进度条的6种方法

    目录 第1种:普通进度条 第2种:带时间的普通进度条 第3种:tqdm库 第4种: alive_progress库 第5种:PySimpleGUI库 第6种:progressbar库 相信大家对进度条一定不陌生了,比如在我们安装python库的时候可以看到下载的进度,此外在下载文件时也可以看到类似的进度条,比如下图这种: 应用场景:下载文件.任务计时等 今天辰哥就给大家分享Python的6种不同的实现实时显示处理进度的方式,文中每一种方式都附带一个案例,并提供官方文档,供大家学习,自定义去修改.

  • Qt实现炫酷启动图动态进度条效果

    目录 一.简述 二.动效进度条 1.光效进度条 2.延迟到达进度条 3.接口说明 三.启动图 1.实现思路 2.背景图切换 四.测试 1.构造启动图 2.背景图 3.其他信息 4.事件循环 五.源码 一.简述 最近接到一个新需求,让做一个动效进度条. 由于我们的产品比较大,在软件启动的时候会消耗比较长的时间,原生的进度条已经不能满足我们的需求,这里我们就需要一个会动的进度条,效果如下图所示. 光效进度条主要是做了一个进度动画,在已完成的部分上进行快速的迭代渲染,给用户一种直观感受,我们的软件一直

  • 详解JavaScript+Canvas绘制环形进度条

    目录 效果图 思考 实现思路 具体代码实现 效果图 思考 移动端的场景里经常会出现环形进度条的功能,在实现这个功能前,我预想的解决方案大致有: echarts.antv.canvas.svg 前面两种第三方提供的解决方案当然是简单,拿到案例修整一下即可,但是需要下载依赖,而且代码量不小.有没有不需要依赖第三方包,采用原生的写法,独立封装成一个组件,降低耦合,而且性能优越? 当然,那就主要介绍canvas的使用 实现思路 可以展示整个圆.半圆以及任意角度弧形(左右对称)的进度条.整体思路如下: 1

  • 基于Matlab绘制超绚丽的烟花的过程详解

    目录 1.使用效果 2.随机点生成 3.图像膨胀 4.特效「风」模拟 5.级坐标变换 6.图像模糊及再映射 7.图像上色 8.完整代码 1.使用效果 2.随机点生成 我们要构造一个黑色背景,对其添加高斯噪声,然后依据阈值删掉部分噪声,生成一张随机点图片: % 构造黑色背景并生成白色杂点 blackPic=uint8(zeros(800,800)); distPic=imnoise(blackPic,'gaussian',0, 0.11); distPic(distPic<254)=0; 3.图像

  • 使用Matlab制作大富翁小游戏的过程详解

    目录 1.自定义头像及名称 2.买地.收费.破产 3.部分代码展示 gui_init.m self_init.m 4.修改记录 5.下载地址 大富翁大家都玩过,走到建筑的位置可以买地,第二圈走到买过的地可以升级,别人经过后需要付过路费,每次经过起点都会获得一定资金,玩到最后还没破产的就是胜者,这里我用MATLAB制作了一款MATLAB版的大富翁小游戏: 1.自定义头像及名称 点击方框内加号可换头像,点击文本区域可改昵称: 当然即使不换头像点击开始后,也会自动分配头像和名称: 2.买地.收费.破产

  • 利用Matlab绘制地图的超详细教程

    目录 MappingToolbox工具箱安装 局部区域陆地绘制 映射贴图 纹理贴图 线路图绘制 usamap axesm 一些地图绘制可用简易函数 subplot tightmap 边框标签网格快速开关函数 colormap colorbar worldmap和usamap是axesm的子类,worldmap是用于生成世界地图坐标区域,usamap用于生成美国地图坐标区域,本文先在worldmap函数基础上讲解如何导入各种数据绘制各种类型图片,略提一下如何使用usamap,再讲解axesm的各种

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

    目录 1.使用效果 2.制作历程 3.函数用法 4.工具函数完整代码 waitBar_SL1.m waitBar_SL2.m waitBar_SL3.m waitBar_SL4.m 5.下载地址 1.使用效果 2.制作历程 首先我有个程序需要用到进度条,我首先试了一下MATLAB自带的进度条: bar=waitbar(0,'读取数据中...'); % waitbar显示进度条 for i=1:1000 A(i)=rand(); str=['计算中...',num2str(100*i/1000),

  • 利用Matlab绘制各类特殊图形的实例代码

    Matlab绘图介绍 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数.此外,Matlab还提供了直接对图形句柄进行操作的低层绘图操作.这类操作将图形的每个图形元素(如坐标轴.曲线.文字等)看做一个独立的对象,系统给每个对象分配一个句柄,可以通过句柄对该图形元素进行操作,而不影响其他部分. Matlab绘制特殊图形 1. 绘制极坐标图 说明:使用polarplot函数绘制极

  • 利用Matlab制作一款3D版2048小游戏

    其实逻辑和2维版本完全一样,就不进行详细解说了,直接看效果: 效果: 目前界面还不咋好看,期待大家的优化 还是键盘↑↓←→操作嗷 完整代码: function game20483D global squaremap global colorlist global fontsizelist global baseX baseY baseZ global barHdl textHdl global txtBest txtScore global best fig=figure('units','pi

  • 利用Matlab制作一款刮刮乐抽奖特效

    目录 1.效果展示 2.程序原理说明 2.1奖项设置 2.2随机抽取 2.3绘制图层 2.4滑动鼠标刮奖 3.完整代码 1.效果展示 程序运行效果如下: 如图所示,按住鼠标不松开并滑动鼠标,即可刮开图层: 2.程序原理说明 2.1 奖项设置 奖项设置写在一个cell元胞数组中,第一列为文本信息,第二列为抽到的概率: strSet={'520元红包一个',15/100; '1314元红包一个',5/100; '黑丝水手服',20/100; '黑丝女仆装',20/100; '抱抱×50次',20/1

  • 利用Matlab制作一款狗头翻牌子小游戏

    目录 0游戏效果 1fig界面和背景板 2狗狗牌子与胜利标志 2.1狗狗牌子绘制 2.2游戏胜利标签 2.3鼠标点击牌子回调 3游戏难度按钮组 3.1按钮绘制 3.2难度选择回调 4游戏刷新模块 4.1刷新游戏按钮绘制 4.2模拟鼠标点击 4.3刷新游戏回调 5完整代码 0 游戏效果 就是点击一个牌子时,该牌子和周围四个牌子也会相应发生变化,想办法让所有牌子都在同一面即为游戏胜利. 1 fig界面和背景板 这一段比较简单,主要是对界面和背景板的属性设置,我们采用编程的方式调用app design

  • iOS中利用CoreAnimation实现一个时间的进度条效果

    在iOS中实现进度条通常都是通过不停的设置progress来完成的,这样的进度条适用于网络加载(上传下载文件.图片等).但是对于录制视频这样的需求的话,如果是按照每秒来设置进度的话,显得有点麻烦,于是我就想直接用CoreAnimation来按时间做动画,只要设置最大时间,其他的就不用管了,然后在视频暂停与继续录制时,对动画进行暂停和恢复即可.录制视频的效果如下: 你可以在这里下载demo 那么接下来就是如何用CoreAnimation实现一个进度条控件了. 首先呢,让我们创建一个继承自CASha

  • 如何利用Matlab制作一款真正的拼图小游戏

    效果: 简单原理介绍: 1构造0,1矩阵作为每片拼图的透明度,可以构造出不规则形状的拼图(image函数有alphaData属性可以设置) jigsawMask=zeros(101*5,101*5); jigsawMask(102:404,102:404)=1; [xMesh,yMesh]=meshgrid(1:101*5,1:101*5); dis1=sqrt((xMesh-51).^2+(yMesh-253).^2); dis2=sqrt((xMesh-505+50).^2+(yMesh-2

  • 利用Matlab绘制一个可爱的南瓜灯

    目录 效果及原理 原理 实现方法 完整代码 效果及原理 效果如下: 调一下数据还能改成三角眼: 原理 南瓜主体函数从知友 [九章算法] 的一张图而来,大体是瓜身瓜柄分段函数,然后绕着z轴旋转一周得到曲面,我对数值做了微调,原图及原始数据: 实现方法 这里我故意保留了网格让南瓜看起来有一点布娃娃的感觉,(大家也可以根据自己喜好改写,例如将’EdgeColor’设置为’none’并打个光啥的) % 构造网格 [t,p]=meshgrid(linspace(0,2*pi,200),linspace(0

  • 如何利用Matlab绘制出好看的火山图

    这里画了一个示例: 数据来源 绘制效果: 代码及说明: 使用代码时只需要改一开始导入的数据,和代码提示中X坐标区域范围和Y坐标区域范围,完整代码如下所示: % 读取数据 data=readmatrix('volcano.txt'); logFC=data(:,2); padj=data(:,3); DB_not=(padj>0.5)|(logFC<0.5&logFC>-0.5); DB_up=padj<=0.05&logFC>=0.5; DB_down=pad

随机推荐