Transition_EaseOutInExpo

Syntax

Value.d = Transition_EaseOutInExpo(t.d, b.d, c.d, d.d)

Description

Calculates an intermediate value using an exponential easing curve that combines ease-out and ease-in. The first half of the animation decelerates very sharply, and the second half accelerates very sharply.

Parameters

t.d
The current elapsed time of the animation in milliseconds.

b.d
The starting value of the property being animated.

c.d
The total change in value (target value - starting value).

d.d
The total duration of the animation in milliseconds.

Return Value

Returns the interpolated value (Double) at the current time `t` according to the ease-out-in exponential curve. Returns `b + c` if `t` equals or exceeds `d`.

Example

IncludeFile "ProGUI_PB.pbi"

Structure MyAnimData
  TargetValue.d
  StartValue.d
  x.d
EndStructure

Procedure DrawHandler(Window, EventType, *EventData.PG_EventDraw, *UserData.MyAnimData)
  
    DrawClear(RGB(200, 200, 200), 1) ; Grey background

    ; Draw a box whose X position is animated
    DrawBox(*UserData\x, (*EventData\height / 2) - 25, 50, 50, RGB(0, 0, 255))
    
EndProcedure

Procedure AnimateHandler(Window, EventType, *EventData.PG_EventAnimate, *UserData.MyAnimData)
  
  Select *EventData\state
  
    Case #PG_Event_Animate_Start
      Debug "Animation started."
      
    Case #PG_Event_Animate_Update
      ; Calculate intermediate value using the ease-out-in-expo transition
      *UserData\x = Transition_EaseOutInExpo(*EventData\currentTime, *UserData\StartValue, *UserData\TargetValue - *UserData\StartValue, *EventData\duration) 
      WindowRedraw(Window)
      
    Case #PG_Event_Animate_End
      Debug "Animation ended"
      ; Ensure final value is set exactly
      *UserData\x = *UserData\TargetValue
      WindowRedraw(Window)
      ; Optional: Restart or clean up
      ; FreeStructure(*UserData) 
  EndSelect
EndProcedure

StartProGUI()

MyWindow = CreateWindow(0, 0, 300, 200, "Transition_EaseOutInExpo Example")

If MyWindow
    
  ; Setup data for animation
  *AnimData.MyAnimData = AllocateStructure(MyAnimData)
  *AnimData\StartValue = 10 
  *AnimData\TargetValue = 200
    
  AddEventHandler(MyWindow, #PG_Event_Draw, @DrawHandler(), *AnimData)
  AddEventHandler(MyWindow, #PG_Event_Animate, @AnimateHandler(), *AnimData) 

  ; Start a 2-second animation
  AnimID = StartAnimation(MyWindow, #PG_Any, 2000)

  WindowShow(MyWindow, #True, #PG_WindowShow_ScreenCentered)
  Repeat : Event = WaitWindowEvent() : Until Event = #PB_Event_CloseWindow
  
  StopAnimation(MyWindow, AnimID) 
  FreeStructure(*AnimData)
  
EndIf 

StopProGUI()

See Also

Transition_EaseInExpo, Transition_EaseOutExpo, Transition_EaseInOutExpo, StartAnimation

Supported OS

Windows, Linux