Skip to content
This repository was archived by the owner on Dec 19, 2022. It is now read-only.

Commit 014e38e

Browse files
committed
refactoring and rotate support
1 parent 92870f4 commit 014e38e

32 files changed

+565
-394
lines changed

README.md

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ React Native Gestures
1616
Showcase
1717
--------
1818

19-
![](http://i.imgur.com/qxzroIb.gif?1)
19+
![](http://imgur.com/6dCrcfL.gif)
2020

2121
Getting Start
2222
--------------
@@ -52,16 +52,21 @@ export default React.createClass({
5252
},
5353
return (
5454
<View>
55-
<GestureView gestures={[drag]}>
56-
<Text>I can move</Text>
57-
</GestureView>
58-
59-
<GestureView gestures={[pinch]}>
60-
<Text>I can do pinch</Text>
61-
</GestureView>
62-
63-
<GestureView gestures={[pinch, drag]}>
64-
<Text>I can move and pinch</Text>
55+
<GestureView
56+
style={movable}
57+
gestures={[drag, pinch]}
58+
toStyle={(layout) => {
59+
return {
60+
top: layout.y,
61+
left: layout.x,
62+
width: layout.width,
63+
height: layout.height,
64+
transform: [{rotate: `${layout.rotate}deg`}]
65+
}
66+
}}
67+
onError={console.error.bind(console)}>
68+
<Text>HEHE</Text>
69+
<Text>HEHE</Text>
6570
</GestureView>
6671
</View>
6772
);
@@ -82,6 +87,7 @@ There are few properties it accpets:
8287
* gestures - a `Array` of [gesture](#gestures)s
8388
* onError - a `Function` will be called when anything bad happens
8489
* style - a `style` same as `<View>`'s `style` property
90+
* toStyle - a mapping function that allow you to pick the changes you want to css style
8591
* children - ... you know, just React children, nothing special
8692

8793
Example:

dist/GestureView.js

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument
88

99
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
1010

11-
var _events = require('./events');
11+
var _mixinsEvents = require('./mixins/events');
1212

13-
var _events2 = _interopRequireDefault(_events);
13+
var _mixinsEvents2 = _interopRequireDefault(_mixinsEvents);
1414

15-
var _draggable = require('./draggable');
15+
var _mixinsDraggable = require('./mixins/draggable');
1616

17-
var _draggable2 = _interopRequireDefault(_draggable);
17+
var _mixinsDraggable2 = _interopRequireDefault(_mixinsDraggable);
1818

1919
var _reactNative = require('react-native');
2020

@@ -23,11 +23,12 @@ var _reactNative2 = _interopRequireDefault(_reactNative);
2323
exports['default'] = _reactNative2['default'].createClass({
2424
displayName: 'GestureView',
2525

26-
mixins: [(0, _events2['default'])(['onLayout']), (0, _draggable2['default'])()],
26+
mixins: [(0, _mixinsEvents2['default'])(['onLayout']), (0, _mixinsDraggable2['default'])()],
2727

2828
propTypes: {
2929
gestures: _reactNative.PropTypes.array.isRequired,
3030
onError: _reactNative.PropTypes.func.isRequired,
31+
toStyle: _reactNative.PropTypes.func.isRequired,
3132
style: _reactNative.PropTypes.any,
3233
children: _reactNative.PropTypes.array
3334
},
@@ -37,12 +38,7 @@ exports['default'] = _reactNative2['default'].createClass({
3738

3839
this.layoutStream.subscribe(function (layout) {
3940
return _this.container.setNativeProps({
40-
style: {
41-
height: layout.height,
42-
width: layout.width,
43-
top: layout.y,
44-
left: layout.x
45-
}
41+
style: _this.props.toStyle(layout)
4642
});
4743
}, function (err) {
4844
return _this.props.onError(err);

dist/center.js

Lines changed: 0 additions & 18 deletions
This file was deleted.

dist/create.js

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,11 @@ Object.defineProperty(exports, '__esModule', {
44
value: true
55
});
66

7-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
8-
97
var _ramda = require('ramda');
108

11-
var _withSpecificPointerNumbers = require('./withSpecificPointerNumbers');
12-
13-
var _withSpecificPointerNumbers2 = _interopRequireDefault(_withSpecificPointerNumbers);
14-
15-
function createGesture(options, getInitialLayout, draggable) {
9+
function createGesture(responder, transducer, getInitialLayout, draggable) {
1610
return draggable.onDragStart.flatMap(function () {
17-
return (0, _withSpecificPointerNumbers2['default'])(options.GESTURE_NUMBER, draggable.onDragMove, getInitialLayout).transduce(options.calculate).takeUntil(draggable.onDragRelease);
11+
return responder(draggable.onDragMove, getInitialLayout).transduce(transducer).takeUntil(draggable.onDragRelease);
1812
});
1913
};
2014

dist/distance.js

Lines changed: 0 additions & 16 deletions
This file was deleted.

dist/drag.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,24 @@ Object.defineProperty(exports, '__esModule', {
44
value: true
55
});
66

7+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
8+
79
var _transducersJs = require('transducers.js');
810

9-
var calculate = (0, _transducersJs.map)(function (gesture) {
10-
var layout = gesture.get('initialLayout');
11+
var _responderOneFinger = require('./responder/oneFinger');
12+
13+
var _responderOneFinger2 = _interopRequireDefault(_responderOneFinger);
14+
15+
var responder = _responderOneFinger2['default'];
16+
17+
exports.responder = responder;
18+
var transducer = (0, _transducersJs.map)(function (gesture) {
19+
var layout = gesture.get('initialLayout').set('rotate', 0);
1120
var initialTouch = gesture.get('initialTouches').get(0);
1221
var currentTouch = gesture.get('touches').get(0);
22+
1323
return layout.withMutations(function (l) {
1424
return l.set('x', l.get('x') + (currentTouch.get('pageX') - initialTouch.get('pageX'))).set('y', l.get('y') + (currentTouch.get('pageY') - initialTouch.get('pageY')));
1525
}).toJS();
1626
});
17-
18-
exports.calculate = calculate;
19-
var GESTURE_NUMBER = 1;
20-
exports.GESTURE_NUMBER = GESTURE_NUMBER;
27+
exports.transducer = transducer;

dist/index.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ module.exports = {
44
drag: require('./drag'),
55
pinch: require('./pinch'),
66
create: require('./create'),
7-
draggable: require('./draggable'),
8-
GestureView: require('./GestureView')
7+
draggable: require('./mixins/draggable'),
8+
events: require('./mixins/events'),
9+
GestureView: require('./GestureView'),
10+
responders: {
11+
general: require('./responder/general'),
12+
oneFinger: require('./responder/oneFinger'),
13+
twoFinger: require('./responder/twoFinger')
14+
}
915
};
Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ var _rx = require('rx');
1111

1212
var _rx2 = _interopRequireDefault(_rx);
1313

14-
var _create = require('./create');
14+
var _create = require('../create');
1515

1616
var _create2 = _interopRequireDefault(_create);
1717

1818
var _reactNative = require('react-native');
1919

20+
function yes() {
21+
return true;
22+
}
23+
2024
function draggableMixin(gestureDefs) {
2125
gestureDefs = gestureDefs || [];
2226

@@ -37,7 +41,7 @@ function draggableMixin(gestureDefs) {
3741
var onDragRelease = new _rx2['default'].Subject();
3842

3943
this.onLayout.take(1).subscribe(function (ev) {
40-
target = ev.target;
44+
return target = ev.target;
4145
});
4246

4347
this.onLayout.subscribe(function (ev) {
@@ -51,44 +55,30 @@ function draggableMixin(gestureDefs) {
5155
};
5256

5357
this.gestureResponder = _reactNative.PanResponder.create({
54-
onStartShouldSetPanResponder: function onStartShouldSetPanResponder() {
55-
return true;
56-
},
57-
onStartShouldSetPanResponderCapture: function onStartShouldSetPanResponderCapture() {
58-
return true;
59-
},
60-
onMoveShouldSetPanResponder: function onMoveShouldSetPanResponder() {
61-
return true;
62-
},
63-
onMoveShouldSetPanResponderCapture: function onMoveShouldSetPanResponderCapture() {
64-
return true;
65-
},
58+
onStartShouldSetPanResponder: yes,
59+
onStartShouldSetPanResponderCapture: yes,
60+
onMoveShouldSetPanResponder: yes,
61+
onMoveShouldSetPanResponderCapture: yes,
6662
onPanResponderGrant: function onPanResponderGrant(evt) {
6763
return onDragStart.onNext(evt.nativeEvent);
6864
},
6965
onPanResponderMove: function onPanResponderMove(evt, gestureState) {
7066
return onDragMove.onNext(evt.nativeEvent);
7167
},
72-
onPanResponderTerminationRequest: function onPanResponderTerminationRequest() {
73-
return true;
74-
},
68+
onPanResponderTerminationRequest: yes,
7569
onPanResponderRelease: function onPanResponderRelease(evt) {
7670
return onDragRelease.onNext(evt.nativeEvent);
7771
},
78-
onPanResponderTerminate: function onPanResponderTerminate() {
79-
return true;
80-
},
81-
onShouldBlockNativeResponder: function onShouldBlockNativeResponder() {
82-
return true;
83-
}
72+
onPanResponderTerminate: yes,
73+
onShouldBlockNativeResponder: yes
8474
});
8575

8676
if (this.props && this.props.gestures) {
8777
gestureDefs = gestureDefs.concat(this.props.gestures);
8878
}
8979

90-
this.layoutStream = _rx2['default'].Observable.merge(gestureDefs.map(function (options) {
91-
return (0, _create2['default'])(options, getInitialLayout, draggable);
80+
this.layoutStream = _rx2['default'].Observable.merge(gestureDefs.map(function (def) {
81+
return (0, _create2['default'])(def.responder, def.transducer, getInitialLayout, draggable);
9282
}));
9383
}
9484
};
File renamed without changes.

dist/pinch.js

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,16 @@ Object.defineProperty(exports, '__esModule', {
66

77
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
88

9-
var _center = require('./center');
9+
var _responderTwoFinger = require('./responder/twoFinger');
1010

11-
var _center2 = _interopRequireDefault(_center);
12-
13-
var _distance = require('./distance');
14-
15-
var _distance2 = _interopRequireDefault(_distance);
16-
17-
var _immutable = require('immutable');
11+
var _responderTwoFinger2 = _interopRequireDefault(_responderTwoFinger);
1812

1913
var _transducersJs = require('transducers.js');
2014

21-
var calculate = (0, _transducersJs.compose)((0, _transducersJs.filter)(function (gesture) {
22-
return !(void 0 === gesture.get('touches').get(0) || void 0 === gesture.get('touches').get(1));
23-
}), (0, _transducersJs.map)(function (gesture) {
24-
return gesture.withMutations(function (g) {
25-
var initCenter = _center2['default'].ofTwoTouches(gesture.get('initialTouches'));
26-
var currentCenter = _center2['default'].ofTwoTouches(gesture.get('touches'));
27-
var initDistance = _distance2['default'].ofTwoTouches(gesture.get('initialTouches'));
28-
var currentDistance = _distance2['default'].ofTwoTouches(gesture.get('touches'));
29-
30-
return g.set('increasedDistance', currentDistance - initDistance).set('centerDiff', (0, _immutable.Map)({
31-
x: initCenter.get('x') - currentCenter.get('x'),
32-
y: initCenter.get('y') - currentCenter.get('y')
33-
}));
34-
});
35-
}), (0, _transducersJs.map)(function (gesture) {
15+
var responder = _responderTwoFinger2['default'];
16+
17+
exports.responder = responder;
18+
var transducer = (0, _transducersJs.map)(function (gesture) {
3619
var layout = gesture.get('initialLayout');
3720
var startX = layout.get('x');
3821
var startY = layout.get('y');
@@ -48,10 +31,8 @@ var calculate = (0, _transducersJs.compose)((0, _transducersJs.filter)(function
4831
x: startX - gesture.getIn(['centerDiff', 'x']) - xWidthDiff,
4932
y: startY - gesture.getIn(['centerDiff', 'y']) - yHeightDiff,
5033
width: newWidth,
51-
height: newHeight
34+
height: newHeight,
35+
rotate: gesture.get('angleChanged')
5236
};
53-
}));
54-
55-
exports.calculate = calculate;
56-
var GESTURE_NUMBER = 2;
57-
exports.GESTURE_NUMBER = GESTURE_NUMBER;
37+
});
38+
exports.transducer = transducer;

0 commit comments

Comments
 (0)