circularReveal

Collapses into a circle at your touch point.

The full recording — the example app on an Android emulator and an iOS simulator at once, with circularReveal played several times over. Scrub or pause with the controls.

The old screen shrinks into a circle centred on origin and disappears. Nothing translates — the pixels stay where they are and stop being drawn as the circle passes over them.

Options it takes

OptionTypeDefaultWhat it does here
origin { x: number; y: number } screen centre Where the effect starts, in dp. Pass a touch’s pageX/pageY as-is — the offset inside a modal or form sheet is corrected natively.
durationMs number 650 Animation length. Clamped up to this kind’s floor; 0 means no animation and is never clamped.
settleFrames number 2 Display frames to hold the snapshot before revealing, so the theme swap has painted underneath.

Ignored by this kind: direction, angleDeg, shape, blurStyle, bands. Passing them is harmless.

Minimum duration

A request below 260ms is clamped up to it, natively, so both platforms agree. Below that floor a full-screen copy coming apart has too few frames to read as motion — the eye gets the start and the end and nothing in between, which looks like a flicker rather than a fast transition. durationMs: 0 still means “no animation” and is never clamped.

Usage

withThemeTransition(applyTheme, {
  kind: 'circularReveal',
  durationMs: 650,
  origin: { x: pageX, y: pageY },
});

How it is done

iOSCAShapeLayer mask + CABasicAnimation
AndroidViewAnimationUtils.createCircularReveal