Gesture
Skip support for SwiftUI.Gesture ↗ on Android. Consult the SkipUI module for a complete list of supported SwiftUI.
The following example screens and source code is from SkipUI’s
Showcase sample app
GesturePlayground.swift ↗
import SwiftUI
struct GesturePlayground: View { @State var tapPosition: CGPoint = .zero @State var doubleTapPosition: CGPoint = .zero @State var longPressCount = 0 @State var dragOffset: CGSize = .zero
@State var combinedTapPosition: CGPoint = .zero @State var combinedDoubleTapPosition: CGPoint = .zero @State var combinedLongPressCount = 0 @State var combinedDragOffset: CGSize = .zero
var body: some View { ScrollView { VStack(spacing: 16.0) { HStack { Text("onTapGesture: (\(Int(tapPosition.x)), \(Int(tapPosition.y)))") Spacer() Color.red .frame(width: 150.0, height: 150.0) .onTapGesture { tapPosition = $0 } } HStack { Text("TapGesture: (\(Int(tapPosition.x)), \(Int(tapPosition.y)))") Spacer() Color.red .frame(width: 150.0, height: 150.0) .gesture( TapGesture() .onEnded { _ in tapPosition = CGPoint(x: -1.0, y: -1.0) } ) } HStack { Text(".onTapGesture(2): (\(Int(doubleTapPosition.x)), \(Int(doubleTapPosition.y)))") Spacer() Color.red .frame(width: 150.0, height: 150.0) .onTapGesture(count: 2) { doubleTapPosition = $0 } } HStack { Text("Tap(2): (\(Int(doubleTapPosition.x)), \(Int(doubleTapPosition.y)))") Spacer() Color.red .frame(width: 150.0, height: 150.0) .gesture( TapGesture(count: 2) .onEnded { _ in doubleTapPosition = CGPoint(x: -1.0, y: -1.0) } ) } HStack { Text(".onLongPressGesture: \(longPressCount)") Spacer() Color.red .frame(width: 150.0, height: 150.0) .onLongPressGesture { longPressCount += 1 } onPressingChanged: { val in logger.log("LongPress onChanged: \(val)") } } HStack { Text("LongPress: \(longPressCount)") Spacer() Color.red .frame(width: 150.0, height: 150.0) .gesture( LongPressGesture() .onChanged { val in logger.log("LongPress onChanged: \(val)") } .onEnded { _ in longPressCount += 1 } ) } HStack { Text("Drag") Spacer() Color.red .frame(width: 150.0, height: 150.0) .offset(dragOffset) .gesture( DragGesture() .onChanged { val in dragOffset = val.translation } .onEnded { _ in dragOffset = .zero } ) } HStack { VStack(alignment: .leading) { Text("Tap: (\(Int(combinedTapPosition.x)), \(Int(combinedTapPosition.y)))") Text("Double tap: (\(Int(combinedDoubleTapPosition.x)), \(Int(combinedDoubleTapPosition.y)))") Text("Long press: \(combinedLongPressCount)") Text("Drag") } Spacer() Color.red .frame(width: 150.0, height: 150.0) .offset(combinedDragOffset) .gesture( DragGesture() .onChanged { val in combinedDragOffset = val.translation } .onEnded { _ in combinedDragOffset = .zero } ) .onTapGesture(count: 2) { combinedDoubleTapPosition = $0 } .onTapGesture { combinedTapPosition = $0 } .onLongPressGesture { combinedLongPressCount += 1 } } HStack { Text("Disabled tap: (\(Int(tapPosition.x)), \(Int(tapPosition.y)))") Spacer() Color.red .frame(width: 150.0, height: 150.0) .onTapGesture { tapPosition = $0 } .disabled(true) } } .padding() } .toolbar { PlaygroundSourceLink(file: "GesturePlayground.swift") } }}