【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_CONTROL将TopBase的TIMER属性设置为-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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?