找回密码
 注册
Simdroid-非首页
查看: 164|回复: 3

Matlab GUI:有关滚动条slider的困惑,请帮忙分析一下,代码很短!

[复制链接]
发表于 2009-5-18 19:44:15 | 显示全部楼层 |阅读模式 来自 北京
由于数据量太大,最近要制作一个滚动条来显示。一下是我从萝卜的博客转过来的,具体是哪一页的忘了,萝卜兄请见谅了,只好把博客地址贴出来了:
:http://luobo.ycool.com/archive.html

其代码如下:(我把不太重要的省略了,方便大伙迅速看完)
rand('state',0);
X=rand(100,100);
% imshow(X,[])
imshow(X);
yy=ylim;
axis on
% set(gcf,'position',[154 42 654 571])  
aa=get(gca,'position');
sss=uicontrol(gcf,'style','slider',...
   %这中间我就省略了,是一些设置slider属性的代码
   'value',0.5,'callback',['aa=get(sss,''value'');',...
       'set(gca,''ylim'',round(200*(aa-0.5))+yy);']);

%%%%%%
对于这一句'callback',['aa=get(sss,''value'');', 'set(gca,''ylim'',round(200*(aa-0.5))+yy);']); 有些疑问很是不解,不好意思,刚接触GUI不久。aa=get(sss,'value')应该是实时更新slider的位置值,'ylim'应该是[ymin,ymax],但后面的round(200*(aa-.5))是一个近似值,每一次点击移动的增量,而yy是一个矩阵,yy=ylim,它们是怎么相加的??我仿着自己也做了一个,老不行,最后没办法我想这样实现:set(gca,'xlim',[a1 b1],'ylim',[a2 b2]);可以是可以但只能把坐标增加,没法回来。??请教了。。。。耽误大家时间了

我对于做滚动条的想法:比如横向滚动条,assume:[xmin xmax]=[100 200];先get这个值作为比较的值,即固定这个值和get一个slider的值,如0,不让它随get(gca,'value')而更新,then a=get(silder,'value')来real-time update the slider value. step=a,,增量=step*xmin and *xmax,,,finally;::set(gca,'xlim',[增量+[100 200]]),,,不知道我这样对不对,我按这做的效果前面已说了,可能是我的代码出问题了。。


为了方便我还是把完整代码贴上来:(可以直接运行,,)
figure;
rand('state',0);
X=rand(100,100);
imshow(X,[]);
yy=ylim;
axis on
set(gcf,'position',[154 42 654 571])
aa=get(gca,'position');
sss=uicontrol(gcf,'style','slider',...
   'unit','normalized','position',...
   [aa(1)+aa(3),aa(2),0.05,aa(4)],...
   'BackgroundColor',[0.6 0.6 0.6],'ForegroundColor','r',...
   'string','color','fontsize',14,'SliderStep',[0.01 0.02],...
   'value',0.5,'callback',['aa=get(sss,''value'');',...
       'set(gca,''ylim'',round(200*(aa-0.5))+yy);']);
发表于 2009-5-19 16:54:45 | 显示全部楼层 来自 北京朝阳
Simdroid开发平台
不明白楼主的问题所在,呵呵。矩阵加一个标量即矩阵每个元素加这个标量。
不过就楼主描述来看如下句“aa=get(sss,'value')应该是实时更新slider的位置值”,可能楼主认识有些偏差
那句话的意思是得到slider当前的位置值赋值给aa,而并非更新,更新在你点击完slider后已经发生了。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2009-5-19 23:55:49 | 显示全部楼层 来自 北京
roc兄,先谢谢你的回帖;我首先要说明一点,问题出在我是用GUI的框架来编,而萝卜是直接m文件来生成,还是有点不一样的,我仔细想了想困扰我2天的问题,得出了下面的结论;我从菜单(wiggle)点击,把图片加载到axes里面,这时候根据图片大小就生成了一个坐标,因为我的scale设成auto,然后我可以在那个菜单wiggle的callback函数里应该加上aa=get(gca,'xlim');handles.aa=aa;guidata(hObject,handles);这样在接下来的slider的callback函数里面就可以调用aa通过handles.aa来作为坐标的初始值。具体实现:

形如:
function menu_wiggle_callback(hObject,eventdata,handles)
%......
%......
aa=get(gca,'xlim');
handles.aa=aa;
guidata(hObject,handles);%更新guidata句柄的值,为下次调用aa做准备。

function slider1_callback(hObject,eventdata,handles)

%....
%....
mm=get(handles.slider1,'value');%得到当前slider的位置
bb=handles.aa;%调用aa的值,即原来的xlim值
set(gca,'xlim',mm.*bb+bb);

这样就实现了水平滚动条实时的拖动。。。。终于搞定,这个贴在这等了两天哦~~~再次谢谢roc兄的耐心看贴

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2009-5-20 12:59:42 | 显示全部楼层 来自 北京海淀
roc兄,说明一下,上面的方法有点不太好用,昨天有点激动,呵呵,新的解决方案在:
http://forum.simwe.com/thread-880859-1-1.html,,谢谢了
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-4 23:27 , Processed in 0.056299 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表