
A moving video window is any animated container that carries footage across a composition: a picture-in-picture panel, a screen floating inside a device mockup, a surveillance tile sliding across a control-room wall, a split-screen panel that expands on a music beat, or a display rotating in perspective. The window is a design object. The footage inside it is content. When those two jobs collapse into a single layer, the project becomes brittle: every change to the frame forces a rebuild of the content, and every change to the content risks destroying carefully tuned animation.
The most common failure pattern looks like this. An editor drops a clip into a comp, scales it down, animates its position with keyframes, adds a stroke, then discovers the client wants rounded corners, a soft drop shadow, and a second version of the same sequence with three windows instead of one. Now the position keyframes are tangled with the clip's own framing, the stroke scales oddly, and duplicating the whole thing means redoing every keyframe.
Avoid that by defining the window's parameters before you animate anything:
Build the window's graphics at roughly 1.5x to 2x the largest size it will occupy, and keep a safe margin inside the frame so footage never touches the border. That single habit prevents most of the softness and edge-crawl problems that show up late in a project.
One more framing decision that pays off: define what the window is for. A window that exists to show a face needs different framing rules than a window that exists to show a chart, a game feed, or a dashboard. Face windows want headroom. Data windows want the whole graph visible. Naming these purposes early keeps the layout honest when the scene gets crowded.
The reliable structure for any moving window is a small stack of pre-compositions, not a single flat stack of layers. A workable pattern:
This separation matters because it lets you swap footage without touching the frame, restyle the frame without re-rendering footage, and duplicate an entire window with one copy-paste that keeps its internal logic intact.
Two switches inside pre-comp layers cause most of the confusion in window work.
Continuous rasterize keeps vector shapes crisp when the pre-comp is scaled up. Turn it on for frame comps built from shape layers, and leave it off for content comps full of raster footage, where it changes nothing useful.
Collapse transformations tells After Effects to render the nested comp's layers at the parent's resolution instead of rendering the nested comp at its own resolution and then scaling the result. That means sharper results when you scale a vector-heavy frame up, and softer or slower results when the nested comp contains effects, blurs, or 3D layers that need to be evaluated at final scale. A practical rule: enable collapse for comps that are pure vector graphics being blown up, and leave it off for comps with effects that should be computed at their native resolution.
A shortcut that saves rebuilds: make one wrapper comp per window style, then place wrappers into a scene comp. The scene comp holds the layout and the timing. The wrappers hold the design. When the producer asks for a version with four windows instead of two, you duplicate wrappers and re-time them, not re-build them.
Layer management stops being a chore the moment it becomes a naming system. Adopt prefixes and stick to them:
Number or letter windows by their position in the design, not by the order in which you built them. WIN_LEFT and WIN_RIGHT survive layout changes; WIN_01 and WIN_02 become meaningless the moment a third window appears on the left.
Color labels do the rest. Assign one color to controllers, another to content, another to mattes, and use the timeline panel's label column to sort layers by label when a comp grows past thirty entries. Turn on shy mode for reference layers and background plates you rarely touch, so the timeline shows only what you are actually animating.
Group with parenting, not with pre-comps, when layers need to move together. Group with pre-comps when layers need to be reused, versioned, or handed to another artist. Pre-comping too early hides animation inside a collapsed stack and makes timing adjustments tedious; pre-comping too late leaves a comp with two hundred layers and no reusable parts.
Lock finished layers. Lock the background plate once it is placed, lock the reference still once the frame is aligned. Locking is faster than undoing an accidental two-pixel nudge you did not notice until render.
Place a REF_ comp at the top of the scene stack with a client-approved still, set its opacity to 25-30 percent, and use it as an alignment overlay while you place windows. Turn it off before render. This one habit catches more layout drift than any amount of zooming in and out.
Finally, use layer comments. A short note like planar track applied to CTRL_WIN_A, frames 0-240 saves the next artist an hour of guessing.
Every window should be driven by exactly one null. That null sits at the window's anchor point, and the assembled window comp plus its frame graphics parent to it. When you need the window to move, you keyframe the null. Nothing else gets position keys.
The setup is quick:
If the window must rotate, the null must sit exactly on the intended pivot. A null three pixels off-center produces a visible wobble when the window rotates, and that wobble is nearly impossible to fix later by eye.
Separate the motion of the window from the motion of the footage inside it. Add a second null inside the content comp, parent the footage to it, and use that inner null for panning, pushing in, or re-framing the shot. Now you can nudge the subject's face into a better position without moving the window frame at all.
Add expression controls to the window null so that frequently tuned values live in one place:
Rounding is a good example. On the shape layer, add an expression to the rectangle path's roundness property:
thisComp.layer('CTRL_WIN_A').effect('Corner Radius')('Slider')
Now the entire design system for corners lives on one controller. Change the value once, and every window with the same expression updates.
When a null scales, child stroke weights scale with it. If the client wants a constant two-pixel border regardless of window size, add this to the stroke width:
base = 2;
s = thisComp.layer('CTRL_WIN_A').transform.scale[0] / 100;
base / s
Small expression, large sanity gain when a window animates from thumbnail to full-screen.
There are three common ways to cut a window into footage, and picking the right one affects everything downstream.
The most direct approach: draw a rectangular mask on the clip and animate the mask path. It works, and it is the fastest way to prototype. The downside is that the mask belongs to the footage, so swapping footage means rebuilding the mask, and the mask path cannot be reused as a design element.
Place a shape layer directly above the footage, trim it to the window rectangle, and set the footage's track matte to Alpha Matte. The footage stays untouched, the matte can be animated, feathered, or replaced, and the same matte can drive multiple clips if you pre-comp them together.
Two gotchas matter here. First, a track matte is consumed by the layer below it, so a second layer cannot reuse it without duplicating it. Second, if the footage inside the window animates while the matte stays put, they drift apart. The clean solution is to build the matte and the footage inside the same pre-comp so they travel as a unit.
The most elegant frame construction uses a single shape layer with two rectangle paths. The outer rectangle keeps its fill. The inner rectangle is set to Subtract, which punches a hole. Add a stroke to the shape layer and you have a complete window frame: border, fill, rounded corners, one object, one place to change the radius.
Then use that same frame as an Alpha Inverted Matte on the footage below. Because the matte's alpha exists only in the border area, inverting it hides the border area of the footage and leaves the footage visible through the hole. The result looks like footage sitting inside a frame, and the entire assembly is two layers.
That trick is powerful but has limits. Feathering the frame shape also feathers the footage edge, which is sometimes exactly right and sometimes a muddled mess. When edges matter, keep the footage matte and the frame graphic separate so you can control each edge independently.
A window that must sit on a moving surface in the plate needs tracking data, and the quality of that data decides whether the result looks composited or pasted on.
Use the Tracker panel to place a feature region on a high-contrast, well-lit detail: a corner of a sign, a printed logo, a bright edge on a monitor bezel. Track forward, then track backward from the end, and compare the two results. Drift usually shows up as a mismatch at the middle of the shot. When it does, adjust the attach point at the frame where drift peaks rather than chasing it with extra keyframes.
Apply tracking data to a null, never directly to the window comp. The null becomes the anchor for the whole window, and you can offset the window with a slider rather than fighting baked keyframes.
Point tracking handles translation well and struggles with surfaces that rotate, scale, or shear in plane. Planar tracking solves the plane itself, which is the right tool for screens, posters, walls, and tabletops. Track the plane with enough texture around it, then either export transform data to a null or apply a corner pin to the window so it warps with the surface.
A useful pattern: stabilize the shot with the planar data, build the window cleanly in the stabilized space, then un-stabilize to return the composite to the original camera motion. That approach gives you a rock-steady workspace for design work and preserves the original handheld energy in the final shot.
When the camera genuinely moves through space and the window needs to sit on a plane in that space, use a 3D camera solve. Run the camera tracker, pick a track point with good parallax and a sensible ground orientation, create a solid and camera from that point, then convert the window comp to 3D and scale it until its corners meet the surface.
Watch for two problems. Lens distortion and rolling shutter both corrupt the solve; correct them before tracking rather than after. And shots with very little parallax produce jittery solves, which read as a window that vibrates. Damping or baking the resulting motion is often better than starting over.
Sometimes the fastest path is simply keyframing the controller by hand. If you do, enable motion blur on the controller, not just on the window artwork, and add one or two frames of lag behind the camera movement so the window feels like it has mass. Perfect sync looks synthetic; a tiny delay looks physical.
Once more than two windows share a screen, expressions stop being a luxury. A few patterns cover most situations.
Mirrored motion. Make a secondary window follow a primary one at reduced amplitude:
p = thisComp.layer('CTRL_WIN_A').transform.position;
value + [(p[0] - 960) * 0.35, (p[1] - 540) * 0.2]
Slider offset. Let an artist nudge the whole window without touching position keys:
v = thisComp.layer('CTRL_WIN_A').effect('Offset X')('Slider');
value + [v, 0]
Per-window randomness with a stable seed. Handheld wobble that differs per window but never changes on re-render:
seedRandom(index, true);
wiggle(2, 12)
Safe-area clamping. Keep a window inside the frame even when its controller overshoots:
x = clamp(value[0], 300, 1620);
y = clamp(value[1], 200, 880);
[x, y]
Motion-based squash. Add a subtle stretch tied to vertical speed so fast moves feel energetic:
spd = Math.abs(thisComp.layer('CTRL_WIN_A').transform.position.velocity[1]) / 100;
sy = 100 + spd; sx = 100 - spd * 0.5;
[sx, sy]
Expressions are cheap to write and expensive to evaluate every frame. Once an animation is approved, use Keyframe Assistant to convert expressions to keyframes on anything that runs heavy math, then disable the expression. You keep the look and recover the playback speed.
Grids are where manual positioning collapses. Instead of typing coordinates for nine windows, derive them from an index expression placed on the window controller inside a layout comp:
cols = 3; gx = 40; gy = 40; w = 560; h = 315;
i = index - 1;
c = i % cols;
r = Math.floor(i / cols);
[c * (w + gx) + w / 2, r * (h + gy) + h / 2]
Add a window, and the grid reflows. Change the gutter once, and the whole composition updates.
For staggered reveals, drive opacity and position from the same index value so windows animate in sequence:
d = (index - 1) * 0.12;
t = time - inPoint - d;
linear(t, 0, 0.5, 0, 100)
That single line replaces a dozen hand-placed keyframes and stays consistent when the window count changes. If the sequence needs to hand off to another editor, promote the master sliders through Essential Graphics so the animation can be re-timed without opening the expression editor.
Layering matters too. Windows that overlap need explicit depth order, and any element that should pass in front of a moving window, such as a foreground hand or a light flare, must sit above the window in the stack. Getting the depth order right early avoids the classic problem of a beautiful window animation that ends up buried behind a graphic element.
A scene with ten moving windows, each with its own matte, blur, and glow, will crawl. The fixes are mostly about deciding where quality actually matters.
Work at half resolution. Set the comp's resolution to half while animating and only switch to full for spot checks. Motion blur and depth of field off during layout, on for review.
Use proxies for footage. Replace 4K clips with quarter-resolution stand-ins while you design, then relink before final render.
Pre-render static windows. A window that never changes after frame 60 does not need to be evaluated for the remaining three minutes.
Limit track mattes. Every matte is an extra render pass. Where a window's look allows it, a mask on a pre-comp or a single shape frame is cheaper than a matte chain.
Be careful with collapse transformations. It sharpens vectors and can drastically slow comps with blurs and effects inside. A/B test it on one window before applying it to the whole scene.
Audit expressions. Expressions that reference other comps are slower than ones that stay local. Sample-image effects are slower still. After the animation is locked, convert and disable.
Purge and cache deliberately. Clear the disk cache before a final render, and let After Effects cache only the frames you are actually reviewing.
A five-minute audit before render routinely saves an hour of waiting and a round of client notes triggered by dropped frames during playback.
Symptom: the window edge and the clip drift apart. Fix: move the keyframes onto the controller null, and parent the window artwork and the footage to it.
Symptom: the window looks soft and slightly wrong in scale. Cause: a pre-comp scaled inside its own comp and again by a parent. Fix: keep scale in one place, usually the controller null, and leave inner comps at 100 percent.
Symptom: rounded corners turn into ovals. Cause: non-uniform scale applied to a rounded rectangle. Fix: scale uniformly and rebuild the layout proportions, or drive roundness with an expression rather than relying on scale.
Symptom: the window artwork blurs but the movement looks stiff, or vice versa. Fix: enable motion blur on the layer that actually carries the animation, and check the comp's motion blur settings rather than the layer switches alone.
Symptom: the window creeps a few pixels over a long shot. Fix: re-track with a cleaner feature, average forward and backward passes, or anchor the track at the midpoint of the shot instead of the first frame.
Design the frame at the smallest size it will render at, not the largest, then check it on a phone screen. Thick strokes and generous corner radius survive downscaling; thin strokes and tight details do not.
Use masks for quick prototypes and single-use windows inside one comp. Use mattes or a dedicated shape layer when the window design will be reused, animated, or handed to another artist.
Expose the master null's slider controls through Essential Graphics, lock everything else, and document which sliders drive which values. A template with five labeled sliders beats a template with fifty keyframes.
Yes. Keyframe the controller's scale and position together, and add a small amount of counter-rotation or perspective corner pinning so the window does not look like a flat card sliding toward the viewer. If the camera moves through real space, a 3D-tracked placement will always read better than a 2D scale cheat.
One null per window, and one place for every tunable value. Everything else in this workflow is a refinement of that idea: separate the container from the content, put the container on a controller, and never keyframe anything twice.

Alexander
Vidu Q4 alternatives compared: Kling 4.0, Seedance 2.5, Wan 3.0, and Runway Gen-4 — 4K support, input modes, durations, audio, and what each costs in credits on Domer.
The top 4K AI image generators on Domer compared: Flux 3 Klein, Nano Banana 2.1, GPT Image 2.5, GPT Image 2, and Nano Banana Pro — 4K credit costs, reference limits, and speed.
Nano Banana 2.1 vs GPT Image 2.5 Flare compared: credit costs per resolution, aspect ratios, reference images, text rendering, and which tasks fit each model.