PanResponder
Official documentation 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.
see Event
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 is the abstract type for a PanResponder, which can be created by means of the create method, given a config object
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
) => configpanHandlers is the abstract type for panHandlers of a PanResponder, which can be accessed by means of the getter method panHandlers
callback('a) is the type of the usual callback function specified for each Gesture Responder System handler defined as
type callback('a) = Event.pressEvent => 'awhere 'a is either bool or unit
create allows creation of a PanResponder given a config
create: config => t
panHandlers is a getter method to access panHandlers within a PanResponder
panHandlers: t => panHandlers
onMoveShouldSetResponder is a getter method to access the onMoveShouldSetResponder callback of a panHandlers object
onMoveShouldSetResponder: panHandlers => callback(bool)
onMoveShouldSetResponderCapture is a getter method to access the onMoveShouldSetResponderCapture callback of a panHandlers object
onMoveShouldSetResponderCapture: panHandlers => callback(bool)
onStartShouldSetResponder is a getter method to access the onStartShouldSetResponder callback of a panHandlers object
onStartShouldSetResponder: panHandlers => callback(bool)
onStartShouldSetResponderCapture is a getter method to access the onStartShouldSetResponderCapture callback of a panHandlers object
onStartShouldSetResponderCapture: panHandlers => callback(bool)
onResponderReject is a getter method to access the onResponderReject callback of a panHandlers object
onResponderReject: panHandlers => callback(unit)
onResponderGrant is a getter method to access the onResponderGrant callback of a panHandlers object
onResponderGrant: panHandlers => callback(unit)
onResponderRelease is a getter method to access the onResponderRelease callback of a panHandlers object
onResponderRelease: panHandlers => callback(unit)
onResponderMove is a getter method to access the onResponderMove callback of a panHandlers object
onResponderMove: panHandlers => callback(unit)
onResponderTerminate is a getter method to access the onResponderTerminate callback of a panHandlers object
onResponderTerminate: panHandlers => callback(unit)
onResponderStart is a getter method to access the onResponderStart callback of a panHandlers object
onResponderStart: panHandlers => callback(unit)
onResponderTerminationRequest is a getter method to access the onResponderTerminationRequest callback of a panHandlers object
onResponderTerminationRequest: panHandlers => callback(bool)
onResponderEnd is a getter method to access the onResponderEnd callback of a panHandlers object
onResponderEnd: panHandlers => callback(unit)
As props spread is not possible with the ReasonML 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 =
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>;
};