Rive Animation Principles
Implement all 12 Disney animation principles using Rive's state machine and interactive animations.
- Squash and Stretch
In Rive Editor:
-
Create shape with bones
-
Animate scale X/Y with inverse relationship
-
Key: scaleX: 1.2 when scaleY: 0.8
// Trigger from code rive.play('squash_stretch');
- Anticipation
State Machine Setup:
-
Create "Idle" state
-
Create "Anticipate" state (wind-up pose)
-
Create "Action" state
-
Connect: Idle → Anticipate → Action
const inputs = rive.stateMachineInputs('State Machine'); const trigger = inputs.find(i => i.name === 'jump'); trigger.fire(); // Plays anticipate → action sequence
- Staging
In Rive:
-
Use artboard layers for depth
-
Apply blur/opacity to background layers
-
Use nested artboards for complex scenes
// Control visibility const bgOpacity = inputs.find(i => i.name === 'bgOpacity'); bgOpacity.value = 0.6;
- Straight Ahead / Pose to Pose
Pose to Pose in Rive:
-
Set key poses on timeline
-
Rive interpolates between
-
Use easing curves in Graph Editor
- Follow Through and Overlapping Action
In Rive Editor:
-
Use bone hierarchy with constraints
-
Apply "delay" or "lag" to child bones
-
Or offset keyframes by 2-4 frames
-
Use spring constraints for natural follow-through
- Slow In and Slow Out
In Rive Graph Editor:
-
Select keyframes
-
Apply easing: Cubic, Quad, Bounce
-
Adjust bezier handles for custom curves
// Runtime speed control rive.play('animation', { speed: 0.5 });
- Arc
In Rive:
-
Use IK (Inverse Kinematics) for natural arcs
-
Apply path constraints
-
Animate position with curved interpolation
- Secondary Action
State Machine approach:
// Listen for state changes rive.on('statechange', (event) => { if (event.data.includes('button_press')) { // Secondary animations auto-trigger via state machine } });
// Or blend multiple animations rive.play(['main_action', 'secondary_particles']);
- Timing
// Fast - snappy feedback rive.play('click', { speed: 1.5 });
// Normal rive.play('hover');
// Slow - dramatic reveal rive.play('reveal', { speed: 0.5 });
In Rive Editor:
-
Adjust animation duration
-
Use work area to fine-tune timing
-
Graph Editor for precise control
- Exaggeration
In Rive:
-
Push bone rotations beyond natural limits
-
Exaggerate scale transformations
-
Use elastic/bounce interpolation
-
Overshoot in Graph Editor curves
- Solid Drawing
In Rive:
-
Use multiple bones for volume preservation
-
Apply constraints to maintain form
-
Use clipping for depth illusion
-
Layer shapes for 3D effect
- Appeal
Design in Rive:
-
Smooth bezier curves on shapes
-
Consistent stroke weights
-
Pleasing color palette
-
Clean bone structure
// Smooth hover interactions const hover = inputs.find(i => i.name === 'isHovering'); element.addEventListener('mouseenter', () => hover.value = true); element.addEventListener('mouseleave', () => hover.value = false);
React Implementation
import { useRive, useStateMachineInput } from '@rive-app/react-canvas';
function AnimatedButton() { const { rive, RiveComponent } = useRive({ src: 'button.riv', stateMachines: 'Button', autoplay: true });
const hoverInput = useStateMachineInput(rive, 'Button', 'isHovering');
return ( <RiveComponent onMouseEnter={() => hoverInput.value = true} onMouseLeave={() => hoverInput.value = false} /> ); }
Key Rive Features
-
State Machines - Logic-driven animation flow
-
Inputs - Boolean, Number, Trigger types
-
Blend States - Mix multiple animations
-
Listeners - Pointer events in editor
-
Constraints - IK, path, distance, rotation
-
Bones & Meshes - Skeletal animation
-
Runtime API - Full control from code
-
Tiny file size - Optimized binary format