react-native-image-gallery-refis360movil
Version:
A React Native image gallery browser with interactive animations
90 lines • 5.28 kB
JavaScript
import * as PropTypes from 'prop-types';
import * as React from 'react';
import { Animated, StyleSheet } from 'react-native';
const OPACITY_RANGE = [0.01, 0.015, 0.999, 1];
const TRANSITION_RANGE = [0.02, 0.998];
export class ImageTransitionView extends React.PureComponent {
render() {
const { width, height, source, imageWidth, imageHeight, transitionProgress, dismissScrollProgress, openImageMeasurements, initialImageMeasurements } = this.props;
let startScale = 0;
let startTranslateX = 0;
let startTranslateY = 0;
let inlineAspectX = 1;
let inlineAspectY = 1;
const aspectRatio = imageWidth / imageHeight;
const screenAspectRatio = width / height;
if (aspectRatio - screenAspectRatio > 0) {
const maxDim = openImageMeasurements.width;
const srcShortDim = initialImageMeasurements.height;
const srcMaxDim = srcShortDim * aspectRatio;
startScale = srcMaxDim / maxDim;
inlineAspectX = initialImageMeasurements.width / initialImageMeasurements.height / aspectRatio;
inlineAspectY = aspectRatio;
}
else {
const maxDim = openImageMeasurements.height;
const srcShortDim = initialImageMeasurements.width;
const srcMaxDim = srcShortDim / aspectRatio;
startScale = srcMaxDim / maxDim;
inlineAspectX = 1 / aspectRatio;
inlineAspectY = aspectRatio * initialImageMeasurements.height / initialImageMeasurements.width;
}
const translateInitY = initialImageMeasurements.y + initialImageMeasurements.height * 0.5;
const translateDestY = openImageMeasurements.y + openImageMeasurements.height * 0.5;
startTranslateY = Math.floor(translateInitY - translateDestY);
const translateInitX = initialImageMeasurements.x + initialImageMeasurements.width * 0.5;
const translateDestX = openImageMeasurements.x + openImageMeasurements.width * 0.5;
startTranslateX = Math.floor(translateInitX - translateDestX);
const translateY = dismissScrollProgress
? Animated.add(transitionProgress.interpolate({ inputRange: TRANSITION_RANGE, outputRange: [startTranslateY, 0] }), Animated.multiply(dismissScrollProgress.interpolate({ inputRange: [0, height, height * 2], outputRange: [300, 0, -300] }), dismissScrollProgress.interpolate({
inputRange: [0, height * 0.5, height, height * 1.5, height * 2],
outputRange: [0, 1, 1, 1, 0]
})))
: transitionProgress.interpolate({ inputRange: TRANSITION_RANGE, outputRange: [startTranslateY, 0] });
const containerStyle = {
backgroundColor: 'transparent',
height: openImageMeasurements.height,
left: openImageMeasurements.x,
opacity: transitionProgress.interpolate({ inputRange: OPACITY_RANGE, outputRange: [0, 1, 1, 0] }),
overflow: 'hidden',
position: 'absolute',
top: openImageMeasurements.y,
transform: [
{ translateX: transitionProgress.interpolate({ inputRange: TRANSITION_RANGE, outputRange: [startTranslateX, 0] }) },
{ translateY },
{ scale: transitionProgress.interpolate({ inputRange: TRANSITION_RANGE, outputRange: [startScale, 1] }) },
{ scaleX: transitionProgress.interpolate({ inputRange: TRANSITION_RANGE, outputRange: [inlineAspectX, 1] }) },
{ scaleY: transitionProgress.interpolate({ inputRange: TRANSITION_RANGE, outputRange: [inlineAspectY, 1] }) }
],
width: openImageMeasurements.width
};
const imageStyle = Object.assign({}, StyleSheet.absoluteFillObject, { backgroundColor: 'transparent', transform: [
{ scaleX: transitionProgress.interpolate({ inputRange: TRANSITION_RANGE, outputRange: [1 / inlineAspectX, 1] }) },
{ scaleY: transitionProgress.interpolate({ inputRange: TRANSITION_RANGE, outputRange: [1 / inlineAspectY, 1] }) }
] });
return (React.createElement(Animated.View, { pointerEvents: "none", style: containerStyle },
React.createElement(Animated.Image, { source: source, style: imageStyle })));
}
}
ImageTransitionView.propTypes = {
dismissScrollProgress: PropTypes.instanceOf(Animated.Value).isRequired,
height: PropTypes.number.isRequired,
imageHeight: PropTypes.number.isRequired,
imageWidth: PropTypes.number.isRequired,
initialImageMeasurements: PropTypes.shape({
height: PropTypes.number.isRequired,
width: PropTypes.number.isRequired,
x: PropTypes.number.isRequired,
y: PropTypes.number.isRequired
}).isRequired,
openImageMeasurements: PropTypes.shape({
height: PropTypes.number.isRequired,
width: PropTypes.number.isRequired,
x: PropTypes.number.isRequired,
y: PropTypes.number.isRequired
}).isRequired,
source: PropTypes.any.isRequired,
transitionProgress: PropTypes.object.isRequired,
width: PropTypes.number.isRequired
};
//# sourceMappingURL=ImageTransitionView.js.map