DropTransitionEffectLib — Drop Transition

Vertical columns of the target image drop down to replace the source image, creating a “falling tiles” or “slot machine” style transition. Wraps FireMonkey’s TDropTransitionEffect. Each column drops at a different time determined by the random seed, producing a staggered, mechanical reveal. 15 functions.

CategoryCountDescription
Error Handling4droptrans_error, errormsg$, strerror$, clearerror
Creation & Destruction2droptrans# (create), droptrans_free (destroy)
Target Image3target (get/set), loadtarget
Progress & Seed4progress, randomseed (get/set)
Effect Control2enabled (get/set)
⚠ Target Required: Transition effects need a target image to transition to. Without a target, columns drop to reveal transparent/empty space.

How Drop Transition Works

The image is divided into vertical columns. As progress increases, columns of the target image slide down from the top to cover the source, each column dropping at a different speed controlled by the random seed.

╯ drop-visual
Progress = 0.0        Progress = 0.4        Progress = 1.0
+--+--+--+--+--+     +--+--+--+--+--+     +--+--+--+--+--+
|  SOURCE IMAGE |     |TT|  |TT|  |TT|     |             |
|               |     |TT|  |TT|  |TT|     |   TARGET    |
|               |     |SS|SS|SS|SS|SS|     |   IMAGE     |
|               |     |SS|SS|SS|SS|SS|     |             |
+--+--+--+--+--+     +--+--+--+--+--+     +--+--+--+--+--+
                      T=Target S=Source
ProgressWhat You See
0.0100% source — no columns have dropped
0.25Some columns begin dropping from the top
0.5Staggered drop — columns at various heights
0.75Most columns have landed, a few still falling
1.0100% target — all columns fully dropped

Cross-Platform Support

PlatformStatusNotes
Windows✅ Full SupportGPU-accelerated via Direct2D
Linux✅ Full SupportSoftware rendering fallback
Android✅ Full SupportGPU-accelerated

Error Handling

FunctionSignatureDescription
droptrans_error()droptrans_error@Returns last error code (0 = no error)
droptrans_errormsg$()droptrans_errormsg$@Returns last error message as string
droptrans_strerror$(code)droptrans_strerror$@nConverts an error code to descriptive text
droptrans_clearerror()droptrans_clearerror@Clears the error state

Error Codes

CodeConstantMeaning
0ERR_NONENo error
1ERR_NIL_EFFECTEffect pointer is nil
2ERR_INVALID_EFFECTPointer is not a valid TDropTransitionEffect
3ERR_INVALID_VALUEProperty value out of range
4ERR_NIL_PARENTParent control pointer is nil
5ERR_INVALID_PARENTPointer is not a valid TFmxObject

Creation & Destruction

FunctionSignatureDescription
droptrans#(parent#)droptrans#@#Creates a drop transition effect on the given control. Returns the effect pointer.
droptrans_free(effect#)droptrans_free@#Destroys the effect and removes it from the parent.

Target Image

FunctionSignatureDescription
droptrans_target#(effect#, bitmap#)droptrans_target#@##Sets the target bitmap pointer directly
droptrans_target#(effect#)droptrans_target#@#Gets the current target bitmap pointer
droptrans_loadtarget#(effect#, url$)droptrans_loadtarget#@#$Loads the target image from a URL or file path

Progress

FunctionSignatureDescription
droptrans_progress#(effect#, value)droptrans_progress#@#nSets progress (0.0–1.0)
droptrans_progress(effect#)droptrans_progress@#Gets current progress

Random Seed

Controls the drop timing pattern. Different seeds cause columns to start dropping at different times, changing the stagger pattern. Set before animating for consistent results.

FunctionSignatureDescription
droptrans_randomseed#(effect#, value)droptrans_randomseed#@#nSets random seed (0.0–1.0)
droptrans_randomseed(effect#)droptrans_randomseed@#Gets current seed

Effect Control

FunctionSignatureDescription
droptrans_enabled#(effect#, value)droptrans_enabled#@#nEnables (1) or disables (0)
droptrans_enabled(effect#)droptrans_enabled@#Gets enabled state

Complete Examples

Slider-Controlled Drop

╯ drop-slider.bas
let frm# = Pointer#(0)
let img# = Pointer#(0)
let trans# = Pointer#(0)
let trkProg# = Pointer#(0)
let lblProg# = Pointer#(0)

frm# = form#("Drop Transition", 450, 400)

img# = image#(frm#)
image_bounds#(img#, 125, 30, 200, 150)
image_load#(img#, "https://picsum.photos/200/150?random=1")

trans# = droptrans#(img#)
droptrans_loadtarget#(trans#, "https://picsum.photos/200/150?random=2")

lblProg# = label#(frm#, "Progress: 0.00", 50, 200)
trkProg# = trackbar#(frm#)
trackbar_bounds#(trkProg#, 50, 230, 350, 30)
trackbar_max#(trkProg#, 100)
trackbar_value#(trkProg#, 0)
trackbar_onchange#(trkProg#, "OnProgress")

form_show(frm#)

function OnProgress(sender#) local p
  let p = trackbar_value(trkProg#) / 100
  droptrans_progress#(trans#, p)
  label_text#(lblProg#, "Progress: " + stri$(p, 2))
endfunction

Animated Drop with Timer

╯ drop-animated.bas
let frm# = Pointer#(0)
let img# = Pointer#(0)
let trans# = Pointer#(0)
let tmr# = Pointer#(0)
let btn# = Pointer#(0)
let progress = 0

frm# = form#("Animated Drop", 400, 350)

img# = image#(frm#)
image_bounds#(img#, 100, 30, 200, 150)
image_load#(img#, "https://picsum.photos/200/150?random=1")

trans# = droptrans#(img#)
droptrans_loadtarget#(trans#, "https://picsum.photos/200/150?random=2")

tmr# = timer#()
timer_interval#(tmr#, 30)
timer_enabled#(tmr#, 0)
timer_ontimer#(tmr#, "Animate")

btn# = button#(frm#, "Drop!")
button_bounds#(btn#, 150, 210, 100, 30)
button_onclick#(btn#, "StartDrop")

form_show(frm#)

function StartDrop(sender#)
  progress = 0
  timer_enabled#(tmr#, 1)
  button_enabled#(btn#, 0)
endfunction

function Animate(sender#)
  progress = progress + 0.02
  droptrans_progress#(trans#, progress)
  if progress >= 1 then
    timer_enabled#(tmr#, 0)
    button_enabled#(btn#, 1)
  endif
endfunction

Dual Sliders — Progress + Random Seed

╯ drop-patterns.bas
let frm# = Pointer#(0)
let img# = Pointer#(0)
let trans# = Pointer#(0)
let trkProg# = Pointer#(0)
let trkSeed# = Pointer#(0)
let lblProg# = Pointer#(0)
let lblSeed# = Pointer#(0)

frm# = form#("Drop Patterns", 500, 420)

img# = image#(frm#)
image_bounds#(img#, 150, 20, 200, 150)
image_load#(img#, "https://picsum.photos/200/150?random=1")

trans# = droptrans#(img#)
droptrans_loadtarget#(trans#, "https://picsum.photos/200/150?random=2")
droptrans_progress#(trans#, 0.5)

lblProg# = label#(frm#, "Progress: 0.50", 30, 190)
trkProg# = trackbar#(frm#)
trackbar_bounds#(trkProg#, 30, 215, 440, 25)
trackbar_max#(trkProg#, 100)
trackbar_value#(trkProg#, 50)
trackbar_onchange#(trkProg#, "OnProgress")

lblSeed# = label#(frm#, "Random Seed: 0.00", 30, 260)
trkSeed# = trackbar#(frm#)
trackbar_bounds#(trkSeed#, 30, 285, 440, 25)
trackbar_max#(trkSeed#, 100)
trackbar_value#(trkSeed#, 0)
trackbar_onchange#(trkSeed#, "OnSeed")

form_show(frm#)

function OnProgress(sender#) local p
  let p = trackbar_value(trkProg#) / 100
  droptrans_progress#(trans#, p)
  label_text#(lblProg#, "Progress: " + stri$(p, 2))
endfunction

function OnSeed(sender#) local s
  let s = trackbar_value(trkSeed#) / 100
  droptrans_randomseed#(trans#, s)
  label_text#(lblSeed#, "Random Seed: " + stri$(s, 2))
endfunction

Best Practices

PracticeWhy
Always load a target image before animatingWithout a target, columns drop to reveal nothing
Set random seed before starting animationChanging seed mid-drop produces jarring column jumps
Use slower step (0.01) for dramatic staggerSlower reveals the column-by-column pattern better
Use faster step (0.03–0.05) for snappy transitionsQuick slot-machine feel for UI changes
Try many different seeds for varietyEach seed creates a unique column-drop timing
Combine with BlindTransitionEffectLibBoth use columns; blinds reveal horizontally, drop vertically
Good for game UIs and scoreboardsSlot-machine feel fits games, leaderboards, and reveals
Disable button during animationPrevents overlapping transitions

Quick Reference

FunctionSignatureDescription
ERROR HANDLING
droptrans_error()droptrans_error@Last error code
droptrans_errormsg$()droptrans_errormsg$@Last error message
droptrans_strerror$(code)droptrans_strerror$@nError code to text
droptrans_clearerror()droptrans_clearerror@Clear error state
CREATION & DESTRUCTION
droptrans#(parent#)droptrans#@#Create effect on control
droptrans_free(effect#)droptrans_free@#Destroy effect
TARGET IMAGE
droptrans_target#(effect#, bmp#)droptrans_target#@##Set target bitmap
droptrans_target#(effect#)droptrans_target#@#Get target bitmap
droptrans_loadtarget#(effect#, url$)droptrans_loadtarget#@#$Load target from URL/file
PROGRESS & SEED
droptrans_progress#(effect#, val)droptrans_progress#@#nSet progress (0.0–1.0)
droptrans_progress(effect#)droptrans_progress@#Get progress
droptrans_randomseed#(effect#, val)droptrans_randomseed#@#nSet seed (0.0–1.0)
droptrans_randomseed(effect#)droptrans_randomseed@#Get seed
EFFECT CONTROL
droptrans_enabled#(effect#, val)droptrans_enabled#@#nEnable (1) / disable (0)
droptrans_enabled(effect#)droptrans_enabled@#Get enabled state

15 functions. Part of the Plan9Basic transition effects library system.

See Also

  • BlindTransitionEffectLib — Venetian blinds reveal
  • SlideTransitionEffectLib — Sliding push transition
  • DissolveTransitionEffectLib — Random pixel dissolve
  • CrumpleTransitionEffectLib — Paper crumple transition
  • FloatAnimationLib — Animate progress smoothly