Skip to content
Native Animation
Water Refraction Splash animation preview
Skia

Water Refraction Splash

React Native Water Splash with Refraction and Drag

A tactile welcome screen where a floating image disturbs a living pool before diving beneath the surface.

$9 for this animation

Checkout opens soon. Leave your email and we will tell you the moment you can buy it.

One email when checkout opens. No spam.

Add to your project

Copy the component and its assets into your app with the Native Animation CLI, or paste the agent prompt into Claude Code, Codex or Cursor once the MCP server is connected.

npx nativeanimation add water-splash

About this animation

A React Native water splash animation can turn a welcome screen into a tactile pool with a floating image. This component draws tiled water, moving caustics, foliage shadows, wake, and touch ripples with a Skia runtime shader. A displacement map refracts the title and image shadow using the same wave field, while one Reanimated progress value coordinates the title fade, image scale, welcome reveal, and return. Gesture Handler adds wake and tilt from drag velocity, and a high release or tap starts entry. Use it for a water-themed welcome, an interactive creative introduction, a playful entry screen, or a refraction demo. Customize copy, floating artwork and proportions, fonts, water preset, wave amplitude, caustics, and shadows. Connect onEnter or use enter, reset, and simulateDrag through the ref.

When to use it

  • Create a water-themed welcome screen.
  • Let a floating image trigger entry.
  • Demonstrate synchronized water refraction.
  • Add a tactile creative introduction.

A tactile welcome screen where a floating image disturbs a living pool before diving beneath the surface.

How it works

  1. The component measures its own container with onLayout, then derives every position and size from that local width and height.
  2. A Skia runtime shader draws the tiled pool, animated caustics, soft foliage shadows, wake, and expanding touch ripple.
  3. A displacement-map shader refracts the title and image shadow with the same wave field, keeping all water layers synchronized.
  4. One Reanimated progress value drives the title fade, welcome reveal, image scale, and return choreography on the UI thread.
  5. The pan gesture adds wake and tilt from pointer velocity; releasing high enough triggers the entry spring and calls onEnter.

Install

npx expo install expo-image react-native-gesture-handler react-native-reanimated react-native-worklets @shopify/react-native-skia

On web, CanvasKit must finish loading before this component mounts. Copy canvaskit.wasm to your public assets and call LoadSkiaWeb from the web entry point:

import { LoadSkiaWeb } from '@shopify/react-native-skia/lib/module/web';

await LoadSkiaWeb({ locateFile: () => '/canvaskit.wasm' });

Usage

import WaterRefractionSplash from './WaterRefractionSplash';

export function WelcomeScreen() {
  return (
    <WaterRefractionSplash
      floatingImage={require('./assets/leaf.png')}
      onEnter={() => navigateNext()}
    />
  );
}

Use the visual knobs and imperative controls to adapt the pattern:

import { useRef } from 'react';
import WaterRefractionSplash, {
  type WaterRefractionSplashRef,
} from './WaterRefractionSplash';

export function BrandedWelcome() {
  const splashRef = useRef<WaterRefractionSplashRef>(null);

  return (
    <WaterRefractionSplash
      ref={splashRef}
      title="Breathe"
      instruction="Drag the leaf to enter"
      welcomeText="You're here"
      floatingImage={require('./assets/leaf.png')}
      floatingImageAspectRatio={1.1}
      titleFont={require('./assets/YourSerif.ttf')}
      instructionFontFamily="YourSans"
      welcomeFontFamily="YourSerif"
      look="rippled"
      waveAmplitude={0.015}
      causticsIntensity={0.3}
      shadowDarkness={0.7}
    />
  );
}

The forwarded ref exposes enter(), reset(), and simulateDrag().

Props

PropTypeDefaultDescription
titlestring'Welcome'Large word rendered beneath the refracted water.
instructionstring'Drag the image to enter'Instruction near the bottom edge.
welcomeTextstring'Welcome in'Message revealed after entry.
floatingImageImageSourcePropType—Local or remote image floating above the water.
floatingImageAspectRationumber0.890625Floating image width divided by height.
titleFontDataSourceParamSystem serifSkia font source for the title. Pass a font on web.
instructionFontFamilystringSystemFont family for the instruction.
welcomeFontFamilystringSystemFont family for the welcome message.
look'calm' | 'default' | 'rippled''default'Water personality preset.
waveAmplitudenumberPreset valueWave displacement as a fraction of width.
causticsIntensitynumberPreset valueBrightness of moving caustics.
shadowDarknessnumberPreset valueOpacity of foliage shadows.
floatingImageAccessibilityLabelstring'Floating image'Screen-reader label for the draggable control.
onEnter() => void—Called when the entry reaches its revealed state.
styleStyleProp<ViewStyle>—Outer-container style.
testIDstring—Test identifier for the outer container.

Compatibility

  • Expo SDK 57
  • React Native 0.86
  • Reanimated 4.5
  • React Native Skia 2.6
  • iOS: supported, not yet verified on a device
  • Android: supported, not yet verified on a device
  • Web: verified
  • Works in Expo Go because all native dependencies are included in Expo SDK 57

Accessibility

The floating image is exposed as a labeled button, and tapping it provides the same entry path as dragging. With reduced motion enabled, continuous water, floating, rotation, and ripple motion stop; entry and reveal use short fades and direct movement.

FAQ

Can I enter the water welcome without dragging?
Yes. The floating image is a labeled button and tapping starts the same entry sequence. The ref also exposes enter, reset, and simulateDrag.
Can I customize the water motion and floating image?
Yes. Supply floatingImage and floatingImageAspectRatio, choose calm, default, or rippled with look, and override waveAmplitude, causticsIntensity, and shadowDarkness. Copy and fonts are configurable.
Does the water splash run in Expo Go and on web?
Yes. Its native dependencies are included in Expo SDK 57. Web needs CanvasKit loaded before mounting and a supplied titleFont. Reduce Motion stops continuous water, floating, rotation, and ripples.