PanResponder
PanResponder allows more fine-grained control of the
Gesture Responder System,
as the handlers can depend also on gestureState, in addition to the
Event.pressEvent which are passed to the Gesture Responder System handlers.
In essence, by means of a custom PanResponder, Gesture Responder System
handlers are extended to also depend upon the gestureState.
Types
Event.pressEvent
see Event
gestureState
gestureState contains additional information on the state of the _Gesture
Responder System_
type gestureState = {
stateid: float,
moveX: float,
moveY: float,
x0: float,
y0: float,
dx: float,
dy: float,
vx: float,
vy: float,
numberActiveTouches: int,
}
t
t is the abstract type for a PanResponder, which can be created by means of
the create method, given a config object
config
config is the abstract type for a custom PanResponder configuration; it can
be created by means of the config constructor
config:
(
~onMoveShouldSetPanResponder: (Event.pressEvent, gestureState) => bool=?,
~onMoveShouldSetPanResponderCapture: (Event.pressEvent, gestureState) =>
bool
=?,
~onStartShouldSetPanResponder: (Event.pressEvent, gestureState) => bool=?,
~onStartShouldSetPanResponderCapture: (Event.pressEvent, gestureState) =>
bool
=?,
~onPanResponderReject: (Event.pressEvent, gestureState) => unit=?,
~onPanResponderGrant: (Event.pressEvent, gestureState) => unit=?,
~onPanResponderStart: (Event.pressEvent, gestureState) => unit=?,
~onPanResponderEnd: (Event.pressEvent, gestureState) => unit=?,
~onPanResponderRelease: (Event.pressEvent, gestureState) => unit=?,
~onPanResponderMove: (Event.pressEvent, gestureState) => unit=?,
~onPanResponderTerminate: (Event.pressEvent, gestureState) => unit=?,
~onPanResponderTerminationRequest: (Event.pressEvent, gestureState) => bool
=?,
~onShouldBlockNativeResponder: (Event.pressEvent, gestureState) => bool=?,
unit
) => config
panHandlers
panHandlers is the abstract type for panHandlers of a PanResponder, which
can be accessed by means of the getter method panHandlers
callback<'a>
callback<'a> is the type of the usual callback function specified for each
Gesture Responder System handler defined as
type callback<'a> = Event.pressEvent => 'a
where 'a is either bool or unit
Methods
create
create allows creation of a PanResponder given a config
create: config => t
panHandlers
panHandlers is a getter method to access panHandlers within a PanResponder
panHandlers: t => panHandlers
onMoveShouldSetResponder
onMoveShouldSetResponder is a getter method to access the
onMoveShouldSetResponder callback of a panHandlers object
onMoveShouldSetResponder: panHandlers => callback(bool)
onMoveShouldSetResponderCapture
onMoveShouldSetResponderCapture is a getter method to access the
onMoveShouldSetResponderCapture callback of a panHandlers object
onMoveShouldSetResponderCapture: panHandlers => callback(bool)
onStartShouldSetResponder
onStartShouldSetResponder is a getter method to access the
onStartShouldSetResponder callback of a panHandlers object
onStartShouldSetResponder: panHandlers => callback(bool)
onStartShouldSetResponderCapture
onStartShouldSetResponderCapture is a getter method to access the
onStartShouldSetResponderCapture callback of a panHandlers object
onStartShouldSetResponderCapture: panHandlers => callback(bool)
onResponderReject
onResponderReject is a getter method to access the onResponderReject
callback of a panHandlers object
onResponderReject: panHandlers => callback(unit)
onResponderGrant
onResponderGrant is a getter method to access the onResponderGrant callback
of a panHandlers object
onResponderGrant: panHandlers => callback(unit)
onResponderRelease
onResponderRelease is a getter method to access the onResponderRelease
callback of a panHandlers object
onResponderRelease: panHandlers => callback(unit)
onResponderMove
onResponderMove is a getter method to access the onResponderMove callback of
a panHandlers object
onResponderMove: panHandlers => callback(unit)
onResponderTerminate
onResponderTerminate is a getter method to access the onResponderTerminate
callback of a panHandlers object
onResponderTerminate: panHandlers => callback(unit)
onResponderStart
onResponderStart is a getter method to access the onResponderStart callback
of a panHandlers object
onResponderStart: panHandlers => callback(unit)
onResponderTerminationRequest
onResponderTerminationRequest is a getter method to access the
onResponderTerminationRequest callback of a panHandlers object
onResponderTerminationRequest: panHandlers => callback(bool)
onResponderEnd
onResponderEnd is a getter method to access the onResponderEnd callback of a
panHandlers object
onResponderEnd: panHandlers => callback(unit)
Example
As props spread is not possible with the ReScript JSX 3 syntax, each Gesture Responder System callback needs to be separately specified, with the relevant value obtained by means of the associated getter.
While props spread may not be available, copy-paste is probably supported by your editor...
onMoveShouldSetResponder={
panHandlers->PanResponder.onMoveShouldSetResponder
}
onMoveShouldSetResponderCapture={
panHandlers->PanResponder.onMoveShouldSetResponderCapture
}
onStartShouldSetResponder={
panHandlers->PanResponder.onStartShouldSetResponder
}
onStartShouldSetResponderCapture={
panHandlers->PanResponder.onStartShouldSetResponderCapture
}
onResponderReject={panHandlers->PanResponder.onResponderReject}
onResponderGrant={panHandlers->PanResponder.onResponderGrant}
onResponderRelease={panHandlers->PanResponder.onResponderRelease}
onResponderMove={panHandlers->PanResponder.onResponderMove}
onResponderTerminate={panHandlers->PanResponder.onResponderTerminate}
onResponderStart={panHandlers->PanResponder.onResponderStart}
onResponderTerminationRequest={
panHandlers->PanResponder.onResponderTerminationRequest
}
onResponderEnd={panHandlers->PanResponder.onResponderEnd}
Then, the custom PanResponder can be used as below:
open ReactNative
let windowHeight = Dimensions.get(#window).height
let windowWidth = Dimensions.get(#window).width
let containerStyle = {
open Style
style(
~width=windowWidth->dp,
~height=windowHeight->dp,
~justifyContent=#center,
~alignItems=#centerà
(),
)
}
let config = PanResponder.config(
~onMoveShouldSetPanResponder=(_e, _g) => true,
~onPanResponderRelease=(_e, g) =>
g["dx"] > 0.
? "You swiped right"->Js.Console.warn
: "You swiped left"->Js.Console.warn,
(),
)
let panResponder = PanResponder.create(config)
let panHandlers = panResponder->PanResponder.panHandlers
@react.component
let make = () =>
<View
style=containerStyle
onMoveShouldSetResponder={panHandlers->PanResponder.onMoveShouldSetResponder}
onMoveShouldSetResponderCapture={panHandlers->PanResponder.onMoveShouldSetResponderCapture}
onStartShouldSetResponder={panHandlers->PanResponder.onStartShouldSetResponder}
onStartShouldSetResponderCapture={panHandlers->PanResponder.onStartShouldSetResponderCapture}
onResponderReject={panHandlers->PanResponder.onResponderReject}
onResponderGrant={panHandlers->PanResponder.onResponderGrant}
onResponderRelease={panHandlers->PanResponder.onResponderRelease}
onResponderMove={panHandlers->PanResponder.onResponderMove}
onResponderTerminate={panHandlers->PanResponder.onResponderTerminate}
onResponderStart={panHandlers->PanResponder.onResponderStart}
onResponderTerminationRequest={panHandlers->PanResponder.onResponderTerminationRequest}
onResponderEnd={panHandlers->PanResponder.onResponderEnd}>
<Text> {"Please swipe"->React.string} </Text>
</View>