flutter_gesture_navigation 0.0.1
flutter_gesture_navigation: ^0.0.1 copied to clipboard
A Flutter package for gesture-based navigation using device sensors (accelerometer, gyroscope, magnetometer).
example/lib/main.dart
import 'package:flutter/material.dart';
// ignore: depend_on_referenced_packages
import 'package:get/get.dart';
// ignore: depend_on_referenced_packages
import 'package:sensors_plus/sensors_plus.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
debugShowCheckedModeBanner: false,
home: GestureDemo(),
getPages: [
GetPage(name: '/screen1', page: () => Screen1()),
GetPage(name: '/screen2', page: () => Screen2()),
GetPage(name: '/screen3', page: () => Screen3()),
GetPage(name: '/screen4', page: () => Screen4()),
],
);
}
}
class GestureController extends GetxController {
double threshold = 3.0; // Sensitivity for movement detection
DateTime lastMoveTime = DateTime.now();
void navigateByMovement(double x, double y, double z) {
DateTime now = DateTime.now();
if (now.difference(lastMoveTime).inMilliseconds < 700) {
return; // Prevent rapid multiple detections
}
lastMoveTime = now;
debugPrint("Movement Data: X=$x, Y=$y, Z=$z");
// Determine dominant movement axis
if ((x.abs() > y.abs())) {
if (x > threshold) {
debugPrint("Detected: Right Move");
Get.snackbar("Right Move Detected", "Navigating to Screen 2");
Get.toNamed('/screen2');
} else if (x < -threshold) {
debugPrint("Detected: Left Move");
Get.snackbar("Left Move Detected", "Navigating to Screen 1");
Get.toNamed('/screen1');
}
} else {
if (y > threshold) {
debugPrint("Detected: Up Move");
Get.snackbar("Up Move Detected", "Navigating to Screen 3");
Get.toNamed('/screen3');
} else if (y < -threshold) {
debugPrint("Detected: Down Move");
Get.snackbar("Down Move Detected", "Navigating to Screen 4");
Get.toNamed('/screen4');
}
}
}
}
class GestureDemo extends StatefulWidget {
@override
_GestureDemoState createState() => _GestureDemoState();
}
class _GestureDemoState extends State<GestureDemo> {
final GestureController gestureController = Get.put(GestureController());
@override
void initState() {
super.initState();
accelerometerEvents.listen((AccelerometerEvent event) {
double x = event.x;
double y = event.y;
double z = event.z;
gestureController.navigateByMovement(x, y, z);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Move Device to Navigate')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.phone_android, size: 100, color: Colors.blue),
SizedBox(height: 20),
Text(
'Move your phone Left, Right, Up, Down\nto navigate between screens.',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
],
),
),
);
}
}
class Screen1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Screen 1')),
body: Center(
child: Text('Left Move Detected', style: TextStyle(fontSize: 20)),
),
);
}
}
class Screen2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Screen 2')),
body: Center(
child: Text('Right Move Detected', style: TextStyle(fontSize: 20)),
),
);
}
}
class Screen3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Screen 3')),
body: Center(
child: Text('Up Move Detected', style: TextStyle(fontSize: 20)),
),
);
}
}
class Screen4 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Screen 4')),
body: Center(
child: Text('Down Move Detected', style: TextStyle(fontSize: 20)),
),
);
}
}