diff --git a/packages/docs/src/apis/PanResponder/PanResponder.stories.mdx b/packages/docs/src/apis/PanResponder/PanResponder.stories.mdx
new file mode 100644
index 00000000..7c2d9d9b
--- /dev/null
+++ b/packages/docs/src/apis/PanResponder/PanResponder.stories.mdx
@@ -0,0 +1,20 @@
+import { Meta, Props, Preview, Story } from '@storybook/addon-docs/blocks';
+import * as Stories from './examples';
+
+
+
+# PanResponder
+
+## Examples
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/docs/src/apis/PanResponder/examples/DraggableCircle.js b/packages/docs/src/apis/PanResponder/examples/DraggableCircle.js
new file mode 100644
index 00000000..cacd5a20
--- /dev/null
+++ b/packages/docs/src/apis/PanResponder/examples/DraggableCircle.js
@@ -0,0 +1,110 @@
+/**
+ * @flow
+ */
+
+import React, { PureComponent } from 'react';
+import { PanResponder, StyleSheet, View } from 'react-native';
+
+const CIRCLE_SIZE = 80;
+
+export default class DraggableCircle extends PureComponent {
+ _panResponder = {};
+ _previousLeft = 0;
+ _previousTop = 0;
+ _circleStyles = {};
+ circle = (null: ?{ setNativeProps(props: Object): void });
+
+ constructor() {
+ super();
+ this._panResponder = PanResponder.create({
+ onStartShouldSetPanResponder: this._handleStartShouldSetPanResponder,
+ onMoveShouldSetPanResponder: this._handleMoveShouldSetPanResponder,
+ onPanResponderGrant: this._handlePanResponderGrant,
+ onPanResponderMove: this._handlePanResponderMove,
+ onPanResponderRelease: this._handlePanResponderEnd,
+ onPanResponderTerminate: this._handlePanResponderEnd
+ });
+ this._previousLeft = 20;
+ this._previousTop = 84;
+ this._circleStyles = {
+ style: {
+ left: this._previousLeft,
+ top: this._previousTop,
+ backgroundColor: 'green'
+ }
+ };
+ }
+
+ componentDidMount() {
+ this._updateNativeStyles();
+ }
+
+ render() {
+ return (
+
+
+
+ );
+ }
+
+ _setCircleRef = circle => {
+ this.circle = circle;
+ };
+
+ _highlight() {
+ this._circleStyles.style.backgroundColor = 'blue';
+ this._updateNativeStyles();
+ }
+
+ _unHighlight() {
+ this._circleStyles.style.backgroundColor = 'green';
+ this._updateNativeStyles();
+ }
+
+ _updateNativeStyles() {
+ this.circle && this.circle.setNativeProps(this._circleStyles);
+ }
+
+ _handleStartShouldSetPanResponder = (e: Object, gestureState: Object): boolean => {
+ // Should we become active when the user presses down on the circle?
+ return true;
+ };
+
+ _handleMoveShouldSetPanResponder = (e: Object, gestureState: Object): boolean => {
+ // Should we become active when the user moves a touch over the circle?
+ return true;
+ };
+
+ _handlePanResponderGrant = (e: Object, gestureState: Object) => {
+ this._highlight();
+ };
+
+ _handlePanResponderMove = (e: Object, gestureState: Object) => {
+ this._circleStyles.style.left = this._previousLeft + gestureState.dx;
+ this._circleStyles.style.top = this._previousTop + gestureState.dy;
+ this._updateNativeStyles();
+ };
+
+ _handlePanResponderEnd = (e: Object, gestureState: Object) => {
+ this._unHighlight();
+ this._previousLeft += gestureState.dx;
+ this._previousTop += gestureState.dy;
+ };
+}
+
+const styles = StyleSheet.create({
+ circle: {
+ width: CIRCLE_SIZE,
+ height: CIRCLE_SIZE,
+ borderRadius: CIRCLE_SIZE / 2,
+ position: 'absolute',
+ left: 0,
+ top: 0,
+ touchAction: 'none'
+ },
+ container: {
+ flex: 1,
+ minHeight: 400,
+ paddingTop: 64
+ }
+});
diff --git a/packages/docs/src/apis/PanResponder/examples/LocationXY.js b/packages/docs/src/apis/PanResponder/examples/LocationXY.js
new file mode 100644
index 00000000..79e9b977
--- /dev/null
+++ b/packages/docs/src/apis/PanResponder/examples/LocationXY.js
@@ -0,0 +1,51 @@
+import React, { Component } from 'react';
+import { StyleSheet, View, PanResponder } from 'react-native';
+
+export default class LocationXY extends Component {
+ constructor() {
+ super();
+ this.state = { translateX: 0 };
+ this.panResponder = PanResponder.create({
+ onStartShouldSetPanResponder: () => true,
+ onStartShouldSetPanResponderCapture: () => true,
+ onPanResponderMove: this._handlePanResponderMove,
+ onPanResponderTerminationRequest: () => true
+ });
+ }
+
+ _handlePanResponderMove = (e, gestureState) => {
+ console.log(e.nativeEvent.locationX, e.nativeEvent.locationY);
+ this.setState(state => ({
+ ...state,
+ translateX: gestureState.dx
+ }));
+ };
+
+ render() {
+ const transform = { transform: [{ translateX: this.state.translateX }] };
+ return (
+
+
+
+
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ app: {
+ justifyContent: 'center',
+ alignItems: 'center'
+ },
+ outer: {
+ width: 250,
+ height: 50,
+ backgroundColor: 'skyblue'
+ },
+ inner: {
+ width: 30,
+ height: 30,
+ backgroundColor: 'lightblue'
+ }
+});
diff --git a/packages/docs/src/apis/PanResponder/examples/index.js b/packages/docs/src/apis/PanResponder/examples/index.js
new file mode 100644
index 00000000..ae4c5bd2
--- /dev/null
+++ b/packages/docs/src/apis/PanResponder/examples/index.js
@@ -0,0 +1,2 @@
+export { default as draggableCircle } from './DraggableCircle';
+export { default as locationXY } from './LocationXY';