如何在UI框架中创建闪烁元素

时间:2018-04-13 18:27:06

标签: dialog dm-script

我有一个很好的UIframe对话框,并希望有一个按钮,按下时会导致UI中的元素(即小图像)闪烁。按第二个按钮应该可以阻止元素闪烁。有没有可用的示例代码?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

DM脚本中没有可用的特定动画UI元素。但是,我成功地制造了一个闪烁的'元素通过使用周期性主线程来定期交替位图元素。 以下是示例代码:

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()

请注意,即使关闭对话框窗口,注册的定期任务也会将UIframe对象保留在范围内。 但是,当对话框窗口不再存在时,LookupElement()命令将不会返回有效的TagGroup,因此我使用它来检查此情况并自动取消注册任务,如果它仍在运行。

我的示例代码没有启动/停止闪烁的按钮,但这可以直接添加。只需按照相应的操作方法调用StartBlinkStopBlink

即可