如何在 UI 框架中创建闪烁元素
How to create a blinking element in a UI frame
我有一个很好的 UI 框架对话框,我想要一个按钮,当按下该按钮时会导致 UI 中的一个元素(即小图像)闪烁。按第二个按钮应该停止元素闪烁。有可用的示例代码吗?
感谢您的帮助。
DM 脚本中没有可用的特定动画 UI 元素。但是,我通过使用周期性主线程定期交替位图元素成功地创建了 'blinking' 元素。
这是示例代码:
Class myBlinkDotDLG : UIframe
{
number onBlink
number periodicTaskID
image GetDotImage( object self, number highlight )
{
image dot := realimage( "Dot", 4,40,40)
dot = iradius < 20 ? (20-iradius) : 0
dot /= max(dot)
RGBImage colDot = highlight ? (RGB(255,180,0)*dot) : (RGB(250,80,0)*dot)
colDot = RGB( Red(colDot)+75,Green(colDot)+76,Blue(colDot)+78)
return ColDot
}
void StartBlink( object self )
{
if ( 0 == periodicTaskID )
periodicTaskID = AddMainThreadPeriodicTask( self,"BlinkToggle", 0.5 )
}
void StopBlink( object self )
{
if ( 0 != periodicTaskID )
RemoveMainThreadTask( periodicTaskID )
periodicTaskID = 0
}
void BlinkToggle( object self )
{
onBlink = !onBlink
Result( "\n Blink:" + onBlink )
taggroup dotTG = self.LookUpElement("Dot")
if ( dotTG.TagGroupisValid())
dotTG.DLGGetElement(0).DLGBitmapData(self.GetDotImage(onBlink))
else
self.StopBlink() // Important! You need to unregister the mainthread task if there is no dialog anymore
}
object CreateAndShowDialog( object self )
{
TagGroup DLG, DLGitems
DLG = DLGCreateDialog( "Test", DLGitems )
DLGitems.DLGAddElement( DLGCreateGraphic(40,40).DLGAddBitmap( self.GetDotImage(1) ).DLGIdentifier("Dot") )
DLGitems.DLGAddElement( DLGCreateLabel( "Blinking\tDot" ))
DLG.DLGTableLayout(2,1,0)
self.Init( DLG ).Display( "Blinky" )
self.StartBlink()
return self
}
}
Alloc( myBlinkDotDLG ).CreateAndShowDialog()
请注意,即使对话框 window 关闭,已注册的周期性任务也会将 UI 框架对象保留在范围内。
但是,当对话框 window 不再存在时,LookupElement()
命令将不会 return 一个有效的 TagGroup,所以我用它来检查这种情况并自动注销任务,如果它仍然存在是 运行.
我的示例代码没有 start/stop 闪烁按钮,但可以直接添加。只需调用相应的操作方法 StartBlink
和 StopBlink
我有一个很好的 UI 框架对话框,我想要一个按钮,当按下该按钮时会导致 UI 中的一个元素(即小图像)闪烁。按第二个按钮应该停止元素闪烁。有可用的示例代码吗?
感谢您的帮助。
DM 脚本中没有可用的特定动画 UI 元素。但是,我通过使用周期性主线程定期交替位图元素成功地创建了 'blinking' 元素。 这是示例代码:
Class myBlinkDotDLG : UIframe
{
number onBlink
number periodicTaskID
image GetDotImage( object self, number highlight )
{
image dot := realimage( "Dot", 4,40,40)
dot = iradius < 20 ? (20-iradius) : 0
dot /= max(dot)
RGBImage colDot = highlight ? (RGB(255,180,0)*dot) : (RGB(250,80,0)*dot)
colDot = RGB( Red(colDot)+75,Green(colDot)+76,Blue(colDot)+78)
return ColDot
}
void StartBlink( object self )
{
if ( 0 == periodicTaskID )
periodicTaskID = AddMainThreadPeriodicTask( self,"BlinkToggle", 0.5 )
}
void StopBlink( object self )
{
if ( 0 != periodicTaskID )
RemoveMainThreadTask( periodicTaskID )
periodicTaskID = 0
}
void BlinkToggle( object self )
{
onBlink = !onBlink
Result( "\n Blink:" + onBlink )
taggroup dotTG = self.LookUpElement("Dot")
if ( dotTG.TagGroupisValid())
dotTG.DLGGetElement(0).DLGBitmapData(self.GetDotImage(onBlink))
else
self.StopBlink() // Important! You need to unregister the mainthread task if there is no dialog anymore
}
object CreateAndShowDialog( object self )
{
TagGroup DLG, DLGitems
DLG = DLGCreateDialog( "Test", DLGitems )
DLGitems.DLGAddElement( DLGCreateGraphic(40,40).DLGAddBitmap( self.GetDotImage(1) ).DLGIdentifier("Dot") )
DLGitems.DLGAddElement( DLGCreateLabel( "Blinking\tDot" ))
DLG.DLGTableLayout(2,1,0)
self.Init( DLG ).Display( "Blinky" )
self.StartBlink()
return self
}
}
Alloc( myBlinkDotDLG ).CreateAndShowDialog()
请注意,即使对话框 window 关闭,已注册的周期性任务也会将 UI 框架对象保留在范围内。
但是,当对话框 window 不再存在时,LookupElement()
命令将不会 return 一个有效的 TagGroup,所以我用它来检查这种情况并自动注销任务,如果它仍然存在是 运行.
我的示例代码没有 start/stop 闪烁按钮,但可以直接添加。只需调用相应的操作方法 StartBlink
和 StopBlink