Skip to main content
ExodeUI

EXODEUI DESKTOP

A little space for good ideas.

Choose your platform to get the official ExodeUI installer.

Looking for Intel Mac or other builds? Explore the web studio or check all download options.

Prefer the browser? Open web studio →

React Architecture Concept • Core Motion Model

Flutter Physics Animation: Interactive Spring Simulations

Flutter provides a robust physics simulation library (flutter/physics.dart) that allows widgets to react to real physical forces like springs, friction, and gravity. Unlike standard CurvedAnimation which follows static time curves, SpringSimulation dynamically resolves position and velocity, ensuring continuous gesture handling.

Interactive Concept Explorer
WebGL GPU Acceleration
Input Parameter: 50%Tension: 125
Under the Hood: Engine Architecture

SpringSimulation accepts initial velocity in pixels per second, allowing touch flings to naturally transfer physical inertia into the settling animation.

Runnable ExodeUI React Implementation

Production Ready

Mount the ExodeUICanvas component and bind parameters declaratively without imperative lifecycle hooks:

jsx
import 'package:flutter/material.dart';
import 'package:flutter/physics.dart';

class PhysicsSheet extends StatefulWidget {
  @override
  _PhysicsSheetState createState() => _PhysicsSheetState();
}

class _PhysicsSheetState extends State<PhysicsSheet> with SingleTickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController.unbounded(vsync: this);
  }

  void _springTo(double target, double initialVelocity) {
    // ExodeUI Spring Description
    final spring = SpringDescription(mass: 1.0, stiffness: 420.0, damping: 24.0);
    final simulation = SpringSimulation(spring, _controller.value, target, initialVelocity);
    _controller.animateWith(simulation);
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onVerticalDragEnd: (details) {
        _springTo(1.0, details.velocity.pixelsPerSecond.dy / 1000);
      },
      child: AnimatedBuilder(
        animation: _controller,
        builder: (context, child) => Transform.translate(
          offset: Offset(0, _controller.value * 200),
          child: child,
        ),
        child: Container(height: 300, color: Colors.purple),
      ),
    );
  }
}

Frequently Asked Questions about flutter physics animation

How do I handle interruptible animations in Flutter?

By using AnimationController.unbounded and passing the current position and velocity to a new SpringSimulation when a touch interrupt occurs.

Explore Related Concepts & Architecture Hubs