Holographic effects in Flutter

🌈 Holo effects with Flutter

Push ⭐️ if you like, Thank you シ

📸 Showcase

Get the gyro motion with motion_sensors and convert it to a color wheel.

👩‍💻 Code

import 'dart:async';
import 'dart:math' as math;

import 'package:flutter/material.dart';
import 'package:motion_sensors/motion_sensors.dart';

void main() => runApp(const App());

class App extends StatelessWidget {
  const App({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Holo(),
    );
  }
}

class Holo extends StatelessWidget {
  const Holo({super.key});

  @override
  Widget build(BuildContext context) {
    final Stream<AbsoluteOrientationEvent> stream =
        motionSensors.absoluteOrientation;
    const scale = 6;
    const hue = 0.7;
    const saturation = 0.6;

    return Scaffold(
      body: Center(
        child: StreamBuilder(
            stream: stream,
            builder: (_, snapshot) {
              if (snapshot.hasError) return const Text('ERROR');
              final event = snapshot.data ?? AbsoluteOrientationEvent(0, 0, 0);

              return ShaderMask(
                shaderCallback: LinearGradient(
                  begin: Alignment.topLeft,
                  end: Alignment.bottomRight,
                  colors: [
                    for (var value in event.values.map(_radianToDegree))
                      HSVColor.fromAHSV(
                              hue, value * scale % 360, saturation, 1.0)
                          .toColor(),
                  ],
                ).createShader,
                child: const Icon(
                  Icons.apple,
                  size: 200,
                  color: Colors.white,
                ),
              );
            }),
      ),
    );
  }

  double _radianToDegree(double radian) => (radian * 180 / math.pi) + 180;
}

extension AbsoluteOrientationEventX on AbsoluteOrientationEvent {
  List<double> get values => [yaw, pitch, roll];
}

*You can also do this on Android, but the kotlin version of motion_sensors is out of date and needs to be updated manually.

See:

GitHub

View Github