Skip to content
Bugwise
Menu
Mobile Testing

Gestures

Tap, long press, swipe, pinch and the rest. How touch gestures work, why they clash with each other and with the system, and how to test them so every user can still get the job done.

35 min beginner Mobile

A food delivery app shipped a neat new feature: swipe an order left in your basket to remove it. Within a week, support tickets piled up. “My pizza disappeared.” “I didn’t remove anything!” People were scrolling the basket with their thumb, the thumb drifted a little sideways, and items vanished. No Undo, no confirmation. Some customers only noticed at the door, when the rider handed over half an order.

Nobody had tested scrolling the basket. The swipe worked perfectly when you swiped. It also “worked” when you didn’t mean to.

Why gestures matter

On a phone there is no mouse and no hover. Everything happens through a few gesturesGestureA touch action such as tap, long press, swipe, pinch or drag.Open in glossary →: tap, hold, swipe, pinch. They feel natural, which is exactly why users notice instantly when one misbehaves, and why bugs here feel like the app is “broken” even when the code technically does what it was told.

Gestures are tricky to test because:

The gesture vocabulary

These are the gestures you’ll meet in almost every app, and what they usually mean.

GestureHow it’s doneTypical useWatch out for
TapTouch and lift quicklyOpen, select, press a buttonSmall touch targetsTouch targetThe area of the screen that responds to a tap, which should be large enough for a finger.Open in glossary →, double actions on fast taps
Double tapTwo quick taps in the same spotZoom in on a photo or map, “like” a postSingle-tap action fires first; delay before a single tap registers
Long press (touch and hold)Touch and hold still for about 0.5 sContext menu, select mode, drag to reorderTap action also fires on release; no visual or haptic cue
Swipe (flick)Quick movement, finger lifts while movingDelete or archive a row, next photo, dismiss a cardTriggered by accident while scrolling; too easy or too hard
Drag (pan)Touch, move slowly, liftMove a slider, reorder a list, pan a mapItem jumps, drops in the wrong place, scroll fights the drag
PinchTwo fingers apart (zoom in) or together (zoom out)Photos, maps, PDFsZoom limits, blurry images, losing position
RotateTwo fingers turn around each otherMaps, photo editorsAccidental rotation while zooming
Pull to refreshDrag down when the list is already at the topReload a feed, inbox or order listFires twice, spinner stuck, list jumps
Edge swipeSwipe in from a screen edgeBack, drawers, system menusClashes with app gestures near the edge
Multi-fingerTwo or three fingers at onceTwo-finger tap to zoom out in maps, three-finger undo on iPad/iPhoneHard to discover; conflicts with accessibility gestures

What separates a tap from a swipe

An app doesn’t “see” gestures. It sees a stream of touch points: finger down at (120, 340), moved to (124, 338), lifted after 180 ms. A gesture recognizer turns that stream into a decision using a few thresholds:

  1. Touch slop. A finger always wobbles a few pixels. Movement under a small threshold (Android’s default touch slop is 8 dp, about a millimeter) still counts as “not moving”.
  2. Time. Lift before roughly 500 ms without moving: tap. Stay still longer: long press, which fires while the finger is still down.
  3. Distance and speed. Moved and still moving fast when lifted: swipe (a fling). Moved but slowed down before lifting: drag.
  4. Waiting for a second tap. If a view supports double tap, the app must wait about 300 ms after the first tap before it knows whether a single tap happened. That’s why single taps on zoomable photos can feel slightly slow.
  5. Fingers. Two touch points whose distance changes: pinch. Two points turning around each other: rotate.

Try it: the gesture pad

Play with the pad below and watch how the numbers decide the gesture. Try a slow drag versus a quick flick over the same distance. Hold still until the ring fills. Turn off “Wait for double tap” and double tap: you’ll get a Tap first and then a Double tap, which is exactly how “the like button also opened the post” bugs happen.

✋ Gesture pad

Tap, double tap, press and hold, flick, drag slowly. Works with a mouse or a finger. Pinch and rotate with two fingers on a touch screen, or hold Shift while dragging with a mouse.

Try a gesture here

Recognized

Nothing yet

Duration
–
Distance
–
Velocity
–
Fingers
–

Thresholds used here

  • Touch slop: 10 px of wobble still counts as "not moving"
  • Long press: held still for 500 ms
  • Double tap: second tap within 300 ms
  • Swipe: ≥ 40 px and ≥ 500 px/s at release, otherwise drag
  • Pinch: finger distance changes by ≥ 10%. Rotate: ≥ 15°

History

Your gestures will appear here.

Real apps tune these numbers. iOS and Android use similar defaults, but every app can change them.

Edge swipes belong to the system

Some edges of the screen are reserved. A swipe that starts there is handled by the operating system or by the navigation stack, not by your app’s content.

1
2
3
4

iPhone (Face ID models)

  1. 1 Swipe from the left edge: back to the previous screen (in apps that use the standard navigation)
  2. 2 Swipe down from the top (left/middle): Notification Center
  3. 3 Swipe down from the top-right corner: Control Center
  4. 4 Swipe up from the bottom: Home; swipe up and hold: App Switcher; swipe sideways along the bottom: switch apps
1
1
2
4

Android (gesture navigation)

  1. 1 Swipe in from the left or right edge: system Back (works in every app; Android 14+ can show a predictive back preview)
  2. 2 Swipe down from the top: notification shade; swipe again: Quick Settings
  3. 4 Swipe up from the bottom: Home; swipe up and hold: Recents; swipe sideways along the bottom: switch apps
  4. Older phones or users who prefer it may use 3-button navigation (Back, Home, Recents) instead.

Why testers care: any app gesture that starts in these zones (a drawer that opens from the left edge, a carousel that touches the screen edge, a bottom sheet you drag up) competes with the system.

Things to know:

  • iOS back swipe comes from the navigation controller. Apps with custom navigation sometimes break it, so swiping from the left edge does nothing or, worse, leaves the screen half-dismissed.
  • Android back is a system gesture from both side edges. It must do the same as the back button: close the drawer, dialog or keyboard first, then go back a screen, and only then leave the app. With predictive back, apps that support it show a preview of where you’ll land (since Android 15; on by default for apps that target Android 16).
  • Apps can ask the system to exclude small areas from the back gesture (for example a drawing canvas), but that’s limited and should be rare.
  • In full-screen games and video, iOS may need two swipes from the edge (the first one just shows the indicator), so the game doesn’t get interrupted.

When gestures collide

The most interesting gesture bugs come from conflicts: two things want the same finger movement. Good apps decide early, usually within the first few pixels, which direction the finger is going and then lock to one gesture.

ConflictWhat should happenTypical bug
Horizontal carousel inside a vertical list (product rows on a shopping home screen)Mostly-horizontal movement scrolls the carousel, mostly-vertical scrolls the pagePage won’t scroll when your thumb starts on a carousel; carousel jitters while scrolling
Swipe-to-delete vs. back swipeSwipes starting at the very edge go back; swipes on the row act on the rowTrying to go back deletes the first row, or row swipes navigate back
Map inside a scrolling page (a delivery tracking screen)One finger scrolls the page; panning the map needs two fingers or a “tap to interact” stepYou get stuck “inside” the map and can’t scroll past it
Swipe actions vs. vertical scrollingNo direction lock, no actionA slightly diagonal scroll swipes a row and triggers its action
Pinch-zoom vs. page zoom (web views)The image zooms, not the whole pageThe whole page zooms and the layout breaks
Drawer from the left edge vs. Android backClear grab handle or menu button opens the drawerOpening the drawer sends the user back instead

Discoverability: hidden gestures need a visible way

A gesture is a shortcut, never the only path. Users can’t see swipe actions or long-press menus, so many will never find them. Apple’s and Google’s guidelines both say the same thing: provide a visible control for important actions.

Gesture plus a visible control

Swipe left on an email to delete it, and there is a trash button in the opened email, and “Delete” is in the long-press menu. After deleting, a snackbar says “Email deleted · Undo” (see toast).

Gesture only

The only way to delete is swiping. There is no hint, no button, and once it’s gone, it’s gone. Users who don’t know the gesture can’t delete; users who trigger it by accident can’t recover.

Destructive gestures deserve extra care: a higher threshold (a full swipe or a swipe plus tap on the revealed button), a clear color and icon while swiping, and an Undo afterwards.

Accessibility: every gesture needs an alternative

Lots of people can’t do a precise swipe, pinch or long press: people with tremors or limited dexterity, people using a stylus or a head pointer, and people who can’t see the screen. When VoiceOver (iOS) or TalkBack (Android) is on, gestures change meaning completely: a single tap only selects an item, a double tap activates it, and swiping left or right moves between elements. Your app’s custom swipe never reaches the app.

So for every gesture, check that there’s another way:

  • Screen readers. Custom swipe actions should be exposed as accessibility actions: VoiceOver reads “Actions available” and the user swipes up or down to pick “Delete”. TalkBack lists them in its Actions menu. Standard iOS list swipe actions get this for free; custom-built ones often don’t.
  • Switch Control (iOS) / Switch Access (Android) users scan through items and pick actions from a menu. Drag-only features (reordering, sliders without +/− buttons) are often impossible for them.
  • Voice Control users say “Tap Delete”. That only works if a visible, labeled button exists.
  • WCAGWCAGThe Web Content Accessibility Guidelines, the main international standard for accessibility.Open in glossary → 2.5.1 Pointer Gestures (Level A): anything that needs a multi-finger or path-based gesture (swipe, pinch, drawing a shape) must also work with a single pointer without a path, such as a simple tap on a button. Examples: zoom buttons next to pinch-to-zoom, arrows next to a swipeable carousel.
  • WCAG 2.5.7 Dragging Movements (Level AA, WCAG 2.2): anything done by dragging must also be possible without dragging, such as “Move up / Move down” buttons for a reorderable list.
  • WCAG 2.5.2 Pointer Cancellation (Level A): actions should fire when the finger lifts, not when it touches down, so users can slide off a button to cancel.

Haptic feedback

A light vibration (a “haptic”) confirms that something happened without looking: the long press fired, a swipe passed the point of no return, a toggle snapped. iOS Mail gives a tick when a full swipe crosses the delete threshold; Android gives one when a long press is recognized.

Test that haptics are present where expected, not overused (a buzz on every scroll item is annoying), and that the app respects the system setting (iOS Settings › Sounds & Haptics › System Haptics, Android Settings › Sound & vibration › Vibration & haptics). You can’t feel haptics in a simulatorSimulatorSoftware that imitates a device's behavior on your computer, like Apple's iOS Simulator.Open in glossary → or emulatorEmulatorSoftware that imitates a real device's hardware and OS on your computer, like the Android Emulator.Open in glossary →, so this needs a real deviceReal deviceA physical phone or tablet used for testing, as opposed to an emulator or simulator.Open in glossary →.

What to test

Basic recognition

Conflicts and edges

  • Scroll lists diagonally over swipeable rows and carousels.
  • Swipe back from the left edge (and the right edge on Android) on every screen, including screens with swipeable content.
  • Pull to refresh once, twice quickly, and while a refresh is already running. Watch the network log.
  • Start a gesture and cancel it: drag back to the start, slide off the button, or get interrupted by a call or notification.

Recovery and accessibility

  • Destructive gestures have an Undo or confirmation.
  • Every gesture action is also available through a visible button or menu.
  • Everything works with VoiceOver, TalkBack, Switch Control and Voice Control.
  • Long press respects the system touch-and-hold delay.

Common bugs

#BugWhat you seeTypical severity
1Accidental destructive swipeItems deleted while scrolling or after a tiny nudgeHigh
2No UndoDeleted or archived item is gone with no way backHigh
3Gesture-only actionFeature can’t be reached without a swipe, pinch or drag (fails WCAG 2.5.1 / 2.5.7)High (for affected users)
4Double actionLong press opens the menu and opens the item; double tap “likes” and opens the postMedium
5Pull to refresh misfiresTwo requests, duplicated items, or a spinner that never stopsMedium
6Scroll vs. swipe conflictCarousels, maps or rows hijack vertical scrollingMedium–High
7Broken back gestureEdge swipe does nothing, closes the app, or leaves a half-dismissed screenHigh
8Wrong zoom behaviorPinch zooms the whole page, jumps to a corner, or has no limitLow–Medium
9Stuck state after cancelA row stays half-swiped or a dragged item stays “lifted” after an interruptionMedium
10No feedbackLong press works but nothing shows it’s coming, so users give up earlyLow

Find the bug

This mail app supports swiping, long press and pull to refresh, and it has six gesture bugs. Everything works with a mouse too: drag to swipe or scroll, press and hold for the menu. Explore it like a tester:

  • Swipe a row a little, then a lot. Scroll the list by dragging, not perfectly straight.
  • Try to delete an email without swiping.
  • Press and hold an email, then let go.
  • Pull to refresh and keep an eye on the spinner and the network log.

🐞 Bug hunt: Mail inbox

This demo has 6 hidden bugs. Explore it like a tester, then check your findings.

Found0/6
9:41

Inbox

3 unread · 12 emails

FreshCart9:38Your order is on its wayRider Marco is 8 minutes away with your groceries…
Emma Clarke9:12Dinner on Friday?There is a new ramen place near the station, want to…
Northwind Bank8:47Your statement is readyYour September statement for account ending 4821…
SkyTrail Airlines8:02Check-in is open: LIS → BERYour flight ST 482 departs tomorrow at 07:15…
PulseFitYesterdayYou hit your step goal 5 days in a rowKeep the streak going! This week you walked 52 km…
Daniel NovakYesterdayRe: Sprint review slidesLooks good, I added two screenshots of the new…
CityRideYesterdayYour weekend tripsYou took 3 rides this weekend. Total: €18.40…
Mia (Landlord)MonPlumber visit on TuesdayHi! The plumber will come between 10 and 12, please…
BookNookMonYour library loan is due soon"The Pragmatic Programmer" is due back on Oct 18…
StayWell HotelsSunBooking confirmed #HX-20931Thanks for booking 2 nights in Porto. Check-in from…
Gym BuddiesSatSaturday 9am runMeeting point is the park entrance, bring water…
Tax OfficeFriReminder: file by Oct 31This is a friendly reminder that the deadline for…

How to interact

Mouse or finger: drag rows sideways to swipe, drag the list up/down to scroll, pull down at the top to refresh, press and hold a row for the menu.

Network log

  • Pull to refresh to see API requests…
  1. 1

    Hint: Delete an email, then try to get it back.

  2. 2

    Hint: Drag a row sideways just a little and let go.

  3. 3

    Hint: Open an email or press and hold one. Can you delete it from there?

  4. 4

    Hint: Press and hold a row until the menu appears, then release.

  5. 5

    Hint: Pull down at the top of the list and watch the network log.

  6. 6

    Hint: Scroll the list by dragging up, slightly diagonally.

Tools and how-to

Xcode Simulator

  • A click is a tap; click and drag is a swipe or drag. Click and hold for a long press.
  • Hold Option (⌥) to show two touch points mirrored around the center: drag to pinch, drag in a circle to rotate. Add Shift to move both points together (two-finger drag).
  • Use Device › Home (⇧⌘H) and Device › App Switcher, or drag up from the bottom edge, to test system gestures.
  • Device › Shake triggers the shake gesture (often used for “Undo” or “Report a bug”).
  • The Simulator can’t reproduce haptics, real finger size or touch pressure. Always repeat gesture tests on a real deviceReal deviceA physical phone or tablet used for testing, as opposed to an emulator or simulator.Open in glossary →.

Real iPhone

  • Turn on Settings › Accessibility › Touch › AssistiveTouch to get an on-screen menu with gestures you can trigger with one finger, useful to check single-pointer alternatives.
  • Screen recordings don’t show your touches, so describe your gestures precisely in bug reports (“swipe from the left edge, about 2 cm, slowly”).

Android Emulator

  • Click is a tap, click-drag is a swipe. Hold Ctrl (⌘ on a Mac) while dragging to pinch and zoom.
  • The emulator uses gesture navigation by default on recent system images; switch to 3-button mode under Settings › System › Navigation mode (called Gestures › System navigation on older versions) and test both.

Developer options (tap Build number 7 times to unlock)

adbadbAndroid Debug Bridge: a command-line tool for installing apps, reading logs and controlling Android devices.Open in glossary → for exact, repeatable gestures

adb shell input tap 540 1200                    # tap
adb shell input swipe 540 1200 540 1200 800     # long press (800 ms in one spot)
adb shell input swipe 900 1200 300 1200 150     # fast swipe left
adb shell input swipe 900 1200 860 1200 300     # tiny 40 px swipe: is that enough to delete?

These commands make threshold bugs reproducibleReproducibleA bug that happens again every time you follow the same steps.Open in glossary →: the developer can run exactly the same swipe.

  • VoiceOver: Settings › Accessibility › VoiceOver. Focus a row and swipe up or down to hear its custom actions (“Delete”, “Archive”). Add VoiceOver to Accessibility Shortcut so a triple-click on the side button toggles it.
  • TalkBack: Settings › Accessibility › TalkBack. Focus an item and open the TalkBack menu (three-finger tap, or swipe down then right on older versions) and pick Actions.
  • Switch Control / Switch Access: use the screen as a switch and check every action can be reached by scanning, without dragging.
  • Voice Control (iOS) / Voice Access (Android): say “Show names” or “Show numbers” and check every gesture action has a visible, labeled control you can say.
  • See accessibility testingAccessibility testingChecking that people with disabilities can use the product, for example with a screen reader.Open in glossary → for the bigger picture.

Example test cases

TC-GES-001Short swipe on an email does not delete it

Preconditions

  • Inbox contains at least 5 emails

Steps

  1. Swipe the first email to the left by about 1 cm
  2. Lift the finger

Expected result

The row snaps back (or reveals the Delete button). The email is still in the list.

TC-GES-002Deleting by swipe can be undone

Steps

  1. Swipe an email fully to the left
  2. Tap "Undo" in the snackbar within 5 seconds

Expected result

The email is deleted, a snackbar "Email deleted · Undo" appears, and after Undo the email is back in its original position.

TC-GES-003Diagonal scroll does not trigger swipe actions

Steps

  1. Place a finger on an email
  2. Drag upward about 3 cm while drifting 1 cm sideways
  3. Lift the finger

Expected result

The list scrolls. No row is swiped, deleted or archived.

TC-GES-004Long press opens the menu without opening the email

Steps

  1. Touch and hold an unread email for 1 second
  2. Lift the finger

Expected result

A context menu appears with haptic feedback. The email does not open and stays unread.

TC-GES-005Pull to refresh sends exactly one request

Preconditions

  • Proxy tool or network log is recording

Steps

  1. Scroll the inbox to the top
  2. Pull down past the threshold and release
  3. Wait 5 seconds

Expected result

Exactly one inbox request is sent. New emails appear at the top and the spinner disappears.

TC-GES-006Delete is available without gestures (VoiceOver)

Preconditions

  • VoiceOver is on

Steps

  1. Swipe right until an email is focused
  2. Swipe down to cycle through actions
  3. Double tap when "Delete" is announced

Expected result

VoiceOver announces "Actions available", offers Delete, and the email is deleted with an announcement.

TC-GES-007Back gesture from the edge goes back, not to the row action

Preconditions

  • Android, gesture navigation on

Steps

  1. Open a folder from the mailbox list
  2. Swipe in from the left screen edge over the first email

Expected result

The app goes back to the mailbox list. The first email is not swiped or changed.

TC-GES-008Map zoom works with buttons as well as pinch

Steps

  1. Open order tracking
  2. Pinch out on the map
  3. Tap the "−" zoom button

Expected result

Pinch zooms in around the fingers; the "−" button zooms out one level. Both reach the same minimum and maximum zoom.

Tip: click a test case to expand it.

Checklist

Gesture test checklist

0 of 13 checked

Check your understanding

Quick quiz

0/5 answered · 0 correct

  1. 1.A user moves their finger 60 px but slows to a stop before lifting it. What does a typical recognizer report?

  2. 2.Why can single taps on a zoomable photo feel slightly delayed?

  3. 3.Which finding is a WCAG 2.5.1 Pointer Gestures failure?

  4. 4.Users report emails disappearing "by themselves" while scrolling. What should you test first?

  5. 5.With VoiceOver on, what does a single tap on an email row do?

Key takeaways

  • Gestures are decided by thresholds: touch slop, ~500 ms for long press, ~300 ms double-tap window, distance and release speed for swipe vs. drag.
  • The best bugs live in conflicts: scroll vs. swipe, carousel vs. page, row swipe vs. back gesture, map vs. page. Always try the “wrong” movement on purpose.
  • Edges belong to the system: iOS left-edge back, Android back from both edges, notification shade at the top, Home at the bottom.
  • A gesture is a shortcut, not the only path. Destructive gestures need a deliberate threshold and Undo.
  • Every gesture needs an accessible alternative for VoiceOver, TalkBack, Switch Control and Voice Control users (WCAG 2.5.1, 2.5.7).
  • Repeat gesture tests on a real device: simulators can’t reproduce finger size, haptics or real-world thumb drift.

Next up: what happens to all of this when the user turns the phone sideways, in Orientation and Screen Sizes.

Finished this page?Nice work, this page is complete!

Mark it as done to track your progress. It's saved in this browser, no account needed.

Its review cards are now in Bites ⚡
Esc

Type to search the whole site.