top of page

Implementing Gesture Detection in Flutter


Implementing Gesture Detection in Flutter

Introduction


Flutter is an open-source mobile application development framework created by Google. Flutter allows developers to build cross-platform applications for iOS, Android, and the web. In this blog, we will explore how to use Flutter to create gesture detection features in our applications.


Gestures are physical actions made by a user on a mobile device, such as tapping, swiping, pinching, and dragging. Gesture detection is important for creating engaging user interfaces and improving user experience. Flutter has a built-in GestureDetector widget that enables developers to detect gestures and trigger appropriate actions.


In this blog, we will explore the different types of gestures in Flutter and demonstrate how to detect them in a sample Flutter application.


Types of Gestures in Flutter


Flutter supports a wide range of gestures, including:

  1. Tap Gesture

  2. Double Tap Gesture

  3. Long Press Gesture

  4. Vertical Drag Gesture

  5. Horizontal Drag Gesture

  6. Pan Gesture

  7. Scale Gesture

Tap Gesture


The Tap gesture is triggered when a user taps on the screen. The GestureDetector widget provides an onTap() method that can be used to detect a Tap gesture. The following code shows how to detect a Tap gesture in Flutter:

GestureDetector(
  onTap: () {
    // Handle Tap Gesture
  },
  child: // Your widget here
);

Double Tap Gesture


The Double Tap gesture is triggered when a user taps the screen twice in quick succession. The GestureDetector widget provides an onDoubleTap() method that can be used to detect a Double Tap gesture. The following code shows how to detect a Double Tap gesture in Flutter:

GestureDetector(
  onDoubleTap: () {
    // Handle Double Tap Gesture
  },
  child: // Your widget here
);

Long Press Gesture


The Long Press gesture is triggered when a user presses and holds down on the screen for a certain period of time. The GestureDetector widget provides an onLongPress() method that can be used to detect a Long Press gesture. The following code shows how to detect a Long Press gesture in Flutter:

GestureDetector(
  onLongPress: () {
    // Handle Long Press Gesture
  },
  child: // Your widget here
);

Vertical Drag Gesture


The Vertical Drag gesture is triggered when a user drags their finger up or down on the screen. The GestureDetector widget provides an onVerticalDragUpdate() method that can be used to detect a Vertical Drag gesture. The following code shows how to detect a Vertical Drag gesture in Flutter:

GestureDetector(
  onVerticalDragUpdate: (DragUpdateDetails details) {
    // Handle Vertical Drag Gesture
  },
  child: // Your widget here
);

Horizontal Drag Gesture


The Horizontal Drag gesture is triggered when a user drags their finger left or right on the screen. The GestureDetector widget provides an onHorizontalDragUpdate() method that can be used to detect a Horizontal Drag gesture. The following code shows how to detect a Horizontal Drag gesture in Flutter:

GestureDetector(
  onHorizontalDragUpdate: (DragUpdateDetails details) {
    // Handle Horizontal Drag Gesture
  },
  child: // Your widget here
);

Pan Gesture


The Pan gesture is triggered when a user drags their finger on the screen in any direction. The GestureDetector widget provides an onPanUpdate() method that can be used to detect a Pan gesture. The following code shows how to detect a Pan gesture in Flutter:

GestureDetector(
  onPanUpdate: (DragUpdateDetails details) {
    // Handle Pan Gesture
  },
  child: // Your widget here
);

Scale Gesture


The Scale gesture is triggered when a user performs a pinch or stretch gesture on the screen. The GestureDetector widget provides an onScaleUpdate() method that can be used to detect a Scale gesture. The following code shows how to detect a Scale gesture in Flutter:

GestureDetector(
  onScaleUpdate: (ScaleUpdateDetails details) {
    // Handle Scale Gesture
  },
  child: // Your widget here
);

Implementing Gesture Detection in Flutter


To demonstrate how to implement gesture detection in Flutter, we will create a simple Flutter application that allows users to draw on the screen using their finger.


Step 1: Create a new Flutter project


Create a new Flutter project using the following command:

flutter create gesture_detection

Step 2: Add a GestureDetector widget to the main screen


In the main.dart file, replace the default code with the following code:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Gesture Detection',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Gesture Detection'),
        ),
        body: GestureDetector(
          onPanUpdate: (DragUpdateDetails details) {
            // Handle Drag Update Gesture
          },
          child: CustomPaint(painter: MyPainter()),
        ),
      ),
    );
  }
}

class MyPainter extends CustomPainter {
  List<Offset> points = [];

  @override
  void paint(Canvas canvas, Size size) {
    Paint paint = Paint()
      ..color = Colors.black
      ..strokeCap = StrokeCap.round
      ..strokeWidth = 5.0;

    for (int i = 0; i < points.length - 1; i++) {
      canvas.drawLine(points[i], points[i + 1], paint);
    }
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

In this code, we have added a GestureDetector widget to the body of the Scaffold. We have also defined a CustomPaint widget with a MyPainter class that draws lines on the screen based on user input.


Step 3: Implement the onPanUpdate() method


In the GestureDetector widget, we have implemented the onPanUpdate() method. This method is called when the user drags their finger on the screen. We have added code to update the points list with the current position of the user's finger.

onPanUpdate: (DragUpdateDetails details) {
  setState(() {
    RenderBox renderBox = context.findRenderObject();
    Offset localPosition =
        renderBox.globalToLocal(details.globalPosition);
    points = List.from(points)..add(localPosition);
  });
},

In this code, we use the context.findRenderObject() method to find the RenderBox for the GestureDetector widget. We then use the renderBox.globalToLocal(details.globalPosition) method to convert the global position of the user's finger to a local position on the screen. We then update the points list with the local position.


Step 4: Implement the CustomPainter class


In the MyPainter class, we have implemented the paint() method to draw lines on the screen based on the points in the points list.

@override
void paint(Canvas canvas, Size size) {
  Paint paint = Paint()
    ..color = Colors.black
    ..strokeCap = StrokeCap.round
    ..strokeWidth = 5.0;

  for (int i = 0; i < points.length - 1; i++) {
    canvas.drawLine(points[i], points[i + 1], paint);
  }
}

In this code, we create a new Paint object with a black color, a round stroke cap, and a stroke width of 5.0. We then loop through the points list and draw lines between each point using the canvas.drawLine() method.


Step 5: Run the application


Run the application using the following command:

flutter run

When the application starts, you should see a blank screen. Use your finger to draw on the screen, and you should see lines appear as you move your finger. Lift your finger to stop drawing.


Conclusion


In this blog, we have discussed how to implement gesture detection in Flutter using the GestureDetector widget. We have created a simple Flutter application that allows users to draw on the screen using their finger. We hope this blog has been helpful in understanding how to detect gestures in Flutter.

Blog for Mobile App Developers, Testers and App Owners

 

This blog is from Finotes Team. Finotes is a lightweight mobile APM and bug detection tool for iOS and Android apps.

In this blog we talk about iOS and Android app development technologies, languages and frameworks like Java, Kotlin, Swift, Objective-C, Dart and Flutter that are used to build mobile apps. Read articles from Finotes team about good programming and software engineering practices, testing and QA practices, performance issues and bugs, concepts and techniques. 

bottom of page