react-native-zoomable-view
Version:
Zoomable View or Image on React Native with reanimated v2
132 lines (117 loc) • 5.07 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ZoomableView = void 0;
var _react = _interopRequireDefault(require("react"));
var _reactNative = require("react-native");
var _reactNativeGestureHandler = require("react-native-gesture-handler");
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const styles = _reactNative.StyleSheet.create({
container: {
alignItems: 'center',
justifyContent: 'center'
},
focalPoint: { ..._reactNative.StyleSheet.absoluteFillObject,
width: 20,
height: 20,
backgroundColor: 'blue',
borderRadius: 10
}
});
const ZoomableView = ({
children
}) => {
const scale = (0, _reactNativeReanimated.useSharedValue)(1);
const rotate = (0, _reactNativeReanimated.useSharedValue)(0);
const focalX = (0, _reactNativeReanimated.useSharedValue)(0);
const focalY = (0, _reactNativeReanimated.useSharedValue)(0);
const transitionX = (0, _reactNativeReanimated.useSharedValue)(0);
const transitionY = (0, _reactNativeReanimated.useSharedValue)(0);
const {
width
} = (0, _reactNative.useWindowDimensions)();
const imagePinch = /*#__PURE__*/_react.default.createRef();
const imageRotation = /*#__PURE__*/_react.default.createRef();
const imagePan = /*#__PURE__*/_react.default.createRef();
const pinchHandler = (0, _reactNativeReanimated.useAnimatedGestureHandler)({
onActive: event => {
scale.value = event.scale;
focalX.value = event.focalX;
focalY.value = event.focalY;
},
onEnd: () => {
scale.value = 1;
}
});
const roteteHandler = (0, _reactNativeReanimated.useAnimatedGestureHandler)({
onActive: event => {
rotate.value = event.rotation * 90;
},
onEnd: () => {
rotate.value = (0, _reactNativeReanimated.withSpring)(0);
}
});
const panHandler = (0, _reactNativeReanimated.useAnimatedGestureHandler)({
onActive: event => {
transitionX.value = -event.translationX;
transitionY.value = -event.translationY;
},
onEnd: () => {
transitionX.value = (0, _reactNativeReanimated.withSpring)(0);
transitionY.value = (0, _reactNativeReanimated.withSpring)(0);
}
});
const rStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({
transform: [{
translateX: focalX.value
}, {
translateY: focalY.value
}, {
translateX: -100
}, {
translateY: -100
}, {
scale: scale.value
}, {
translateX: -focalX.value
}, {
translateY: -focalY.value
}, {
translateX: 100
}, {
translateY: 100
}, {
rotate: `${rotate.value}deg`
}, {
translateX: -transitionX.value
}, {
translateY: -transitionY.value
}]
}));
return /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.PanGestureHandler, {
simultaneousHandlers: [imagePinch, imageRotation],
onGestureEvent: panHandler,
ref: imagePan
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, null, /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.PinchGestureHandler, {
ref: imagePinch,
simultaneousHandlers: [imagePan, imageRotation],
onGestureEvent: pinchHandler
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
style: {
width
}
}, /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.RotationGestureHandler, {
ref: imageRotation,
simultaneousHandlers: [imagePan, imagePinch],
onGestureEvent: roteteHandler
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
style: [styles.container, rStyle],
collapsable: false
}, children))))));
};
exports.ZoomableView = ZoomableView;
//# sourceMappingURL=ZoomableView.js.map