【IDL】使用WIDGET_TIMER进行动画控制

IDL中进行动画控制的方法有很多,如下所示的一组过程便可以实现直接图形法的动画控制,并提供了现成的用户界面。如图所示。

  • CW_ANIMATE – 创建复合组件用来显示和控制动画
  • CW_ANIMATE_GETP - 获取由CW_ANIMATE创建的窗口ID
  • CW_ANIMATE_LOAD – 加载图像到动画界面
  • CW_ANIMATE_RUN – 显示加载到动画界面的图片 

图:利用CW_ANIMATE实现动画显示

注:上面的示例代码可以查看IDL中的CW_ANIMATE帮助。

 

下面介绍另一种动画控制的方法,即WIDGET_TIMER。通过判断事件的“STRUCTURE_NAME”是否等于“WIDGET_TIMER”进行动画控制。这里有一个技巧,使用WIDGET_CONTROLTopBaseTIMER属性设置为-1即可暂停动画事件。

直接贴代码,编译运行之后弹出界面,三个按钮分别进行“播放”、“暂停”和“停止”的操作。 

图:动画界面 

;+
; :DESCRIPTION:
;    Example for widget_timer
; :AUTHOR: duhj@geoscene.cn;
; :Date: 2013-4-27
;-
 
PRO TIMER_EXAMPLE_EVENT, ev
 
 WIDGET_CONTROL, ev.TOP, get_uvalue=s
  uname = WIDGET_INFO(ev.ID, /uname)
 
  ;动画间隔时间
  TIMER = 0.01
 
  ;通过WIDGET_TIMER进行动画
 IF (TAG_NAMES(ev, /STRUCTURE_NAME) EQ 'WIDGET_TIMER') THEN BEGIN 
   ;旋转
   s.ROTATE, 1
   ;动画速度
   WIDGET_CONTROL, ev.TOP, TIMER=TIMER   
 ENDIF
 
 CASE uname OF
   'play' : WIDGET_CONTROL, ev.TOP, TIMER=TIMER
   'pause' : WIDGET_CONTROL, ev.TOP, TIMER=-1  ;暂停动画时,设置TIMER=-1即可
   'stop': BEGIN
     WIDGET_CONTROL, ev.TOP, TIMER=-1
     s.ROTATE, /default   ;重置视图
   END
   ELSE:
 ENDCASE 
END
 
PRO TIMER_EXAMPLE
 
 COMPILE_OPT idl2
 
  ;构建界面
  base = WIDGET_BASE(/COLUMN, xoffset = 100, yoffset = 100)
 
  ;开始、暂停、停止三个按钮
  btnBase = WIDGET_BASE(base, /row, /align_center)
  b1 = WIDGET_BUTTON(btnBase, VALUE='Play', uname='play')
  b2 = WIDGET_BUTTON(btnBase, VALUE='Pause', uname='pause')
  b3 = WIDGET_BUTTON(btnBase, VALUE='Stop', uname='stop')
 
  ;创建绘图界面
  wDraw = WIDGET_WINDOW(base, xsize = 400, ysize = 400) 
 WIDGET_CONTROL, base, /REALIZE
 
  ;绘制曲面
  s = SURFACE(/test, /current) 
 WIDGET_CONTROL, base, set_uvalue = s 
 XMANAGER, 'timer_example', base, /NO_BLOCK
 
END
posted @   ENVI-IDL技术殿堂  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示