diff --git a/example/babel.config.js b/example/babel.config.js
index adea77b..c409c94 100644
--- a/example/babel.config.js
+++ b/example/babel.config.js
@@ -13,5 +13,7 @@ module.exports = {
},
},
],
+ '@babel/plugin-proposal-export-namespace-from',
+ 'react-native-reanimated/plugin',
],
};
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
index 5d4a757..d3f302a 100644
--- a/example/ios/Podfile.lock
+++ b/example/ios/Podfile.lock
@@ -339,6 +339,33 @@ PODS:
- React-jsi (= 0.67.5)
- React-logger (= 0.67.5)
- React-perflogger (= 0.67.5)
+ - RNReanimated (2.9.1):
+ - DoubleConversion
+ - FBLazyVector
+ - FBReactNativeSpec
+ - glog
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-callinvoker
+ - React-Core
+ - React-Core/DevSupport
+ - React-Core/RCTWebSocket
+ - React-CoreModules
+ - React-cxxreact
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-RCTActionSheet
+ - React-RCTAnimation
+ - React-RCTBlob
+ - React-RCTImage
+ - React-RCTLinking
+ - React-RCTNetwork
+ - React-RCTSettings
+ - React-RCTText
+ - ReactCommon/turbomodule/core
+ - Yoga
- Yoga (1.14.0)
- YogaKit (1.18.1):
- Yoga (~> 1.14)
@@ -398,6 +425,7 @@ DEPENDENCIES:
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
- React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
+ - RNReanimated (from `../node_modules/react-native-reanimated`)
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
SPEC REPOS:
@@ -478,6 +506,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
ReactCommon:
:path: "../node_modules/react-native/ReactCommon"
+ RNReanimated:
+ :path: "../node_modules/react-native-reanimated"
Yoga:
:path: "../node_modules/react-native/ReactCommon/yoga"
@@ -512,7 +542,7 @@ SPEC CHECKSUMS:
React-jsiexecutor: e9895ccae253323ca70f693945fecbba091f0abd
React-jsinspector: ec4fe4f65ccf9d67c8429dda955d3412db8a25ef
React-logger: 85f4ef06b9723714b2dfa5b0e5502b673b271b58
- react-native-transparent-video: 54d0f657780b0a79a9113167342520cc28954ee0
+ react-native-transparent-video: e484ad11ace8e5f62516e2c5e15efd3cb4df24b0
React-perflogger: d32ee13196f4ae2e4098fb7f8e7ed4f864c6fb0f
React-RCTActionSheet: 81779c09e34a6a3d6b15783407ba9016a774f535
React-RCTAnimation: b778eaaa42a884abcc5719035a7a0b2f54672658
@@ -525,6 +555,7 @@ SPEC CHECKSUMS:
React-RCTVibration: c3b8a3245267a3849b0c7cb91a37606bf5f3aa65
React-runtimeexecutor: 434efc9e5b6d0f14f49867f130b39376c971c1aa
ReactCommon: a30c2448e5a88bae6fcb0e3da124c14ae493dac1
+ RNReanimated: b5b17149593e7c05e4ec5c0efea1f21e05829510
Yoga: 099a946cbf84c9b32ffdc4278d72db26710ecf92
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
diff --git a/example/package.json b/example/package.json
index 7ea8335..c477987 100644
--- a/example/package.json
+++ b/example/package.json
@@ -9,13 +9,15 @@
"pods": "pod-install --quiet"
},
"dependencies": {
+ "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
"react": "17.0.2",
- "react-native": "0.67.5"
+ "react-native": "0.67.5",
+ "react-native-reanimated": "2.9.1"
},
"devDependencies": {
"@babel/core": "^7.12.9",
"@babel/runtime": "^7.12.5",
- "metro-react-native-babel-preset": "^0.66.2",
- "babel-plugin-module-resolver": "^4.1.0"
+ "babel-plugin-module-resolver": "^4.1.0",
+ "metro-react-native-babel-preset": "^0.66.2"
}
-}
\ No newline at end of file
+}
diff --git a/example/src/App.tsx b/example/src/App.tsx
index d739edd..e37ae79 100644
--- a/example/src/App.tsx
+++ b/example/src/App.tsx
@@ -1,7 +1,7 @@
import React, { useEffect, useState } from 'react';
import { StyleSheet, View } from 'react-native';
-import TransparentVideo from 'react-native-transparent-video';
+import Parallax from './components/Parallax';
const video1 = require('../assets/videos/1.mp4');
const video2 = require('../assets/videos/2.mp4');
@@ -31,10 +31,7 @@ export default () => {
return (
-
-
-
-
+
);
};
@@ -44,36 +41,11 @@ const styles = StyleSheet.create({
flex: 1,
alignItems: 'center',
},
- video1: {
+ video: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
- zIndex: 0,
- },
- video2: {
- position: 'absolute',
- top: 0,
- left: 0,
- right: 0,
- bottom: 0,
- zIndex: 1,
- },
- video3: {
- position: 'absolute',
- top: 0,
- left: 0,
- right: 0,
- bottom: 0,
- zIndex: 2,
- },
- video4: {
- position: 'absolute',
- top: 0,
- left: 0,
- right: 0,
- bottom: 0,
- zIndex: 3,
},
});
diff --git a/example/src/components/Parallax.tsx b/example/src/components/Parallax.tsx
new file mode 100644
index 0000000..dec75c4
--- /dev/null
+++ b/example/src/components/Parallax.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+
+import ParallaxVideo from './ParallaxVideo';
+
+const Parallax = ({ layers }: any) => {
+ return (
+ <>
+ {layers.map((layer: any, index: number) => (
+
+ ))}
+ >
+ );
+};
+
+export default Parallax;
diff --git a/example/src/components/ParallaxVideo.tsx b/example/src/components/ParallaxVideo.tsx
new file mode 100644
index 0000000..0bdd42b
--- /dev/null
+++ b/example/src/components/ParallaxVideo.tsx
@@ -0,0 +1,84 @@
+import React from 'react';
+
+import { StyleSheet } from 'react-native';
+import TransparentVideo from 'react-native-transparent-video';
+import Animated, {
+ useAnimatedSensor,
+ SensorType,
+ useAnimatedStyle,
+ interpolate,
+ withTiming,
+} from 'react-native-reanimated';
+
+const OFFSET = 50;
+const PI = Math.PI;
+const HALF_PI = PI / 2;
+
+const ParallaxVideo = ({ source, zIndex }: any) => {
+ const sensor = useAnimatedSensor(SensorType.ROTATION, { interval: 10 });
+
+ const layerStyle = useAnimatedStyle(() => {
+ const { yaw, pitch, roll } = sensor.sensor.value;
+ console.log(yaw, pitch, roll, 99);
+
+ const top = withTiming(
+ interpolate(
+ pitch,
+ [-HALF_PI, HALF_PI],
+ [-OFFSET / zIndex - OFFSET, OFFSET / zIndex - OFFSET]
+ ),
+ { duration: 100 }
+ );
+ const left = withTiming(
+ interpolate(
+ roll,
+ [-PI, PI],
+ [(-OFFSET * 2) / zIndex - OFFSET, (OFFSET * 2) / zIndex - OFFSET]
+ ),
+ { duration: 100 }
+ );
+ const right = withTiming(
+ interpolate(
+ roll,
+ [-PI, PI],
+ [(OFFSET * 2) / zIndex - OFFSET, (-OFFSET * 2) / zIndex - OFFSET]
+ ),
+ { duration: 100 }
+ );
+ const bottom = withTiming(
+ interpolate(
+ pitch,
+ [-HALF_PI, HALF_PI],
+ [OFFSET / zIndex - OFFSET, -OFFSET / zIndex - OFFSET]
+ ),
+ { duration: 10 }
+ );
+ return {
+ top,
+ left,
+ right,
+ bottom,
+ };
+ });
+
+ return (
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ position: 'absolute',
+ },
+ video: {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0,
+ },
+});
+
+export default ParallaxVideo;
diff --git a/example/yarn.lock b/example/yarn.lock
index ccca95e..c66b66a 100644
--- a/example/yarn.lock
+++ b/example/yarn.lock
@@ -169,7 +169,7 @@
dependencies:
"@babel/types" "^7.18.6"
-"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0":
+"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56"
integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==
@@ -281,6 +281,14 @@
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/plugin-syntax-export-default-from" "^7.18.6"
+"@babel/plugin-proposal-export-namespace-from@^7.17.12", "@babel/plugin-proposal-export-namespace-from@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203"
+ integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.1.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
@@ -338,6 +346,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.6", "@babel/plugin-syntax-flow@^7.2.0":
version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz#3e37fca4f06d93567c1cd9b75156422e90a67107"
@@ -502,7 +517,7 @@
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/helper-simple-access" "^7.21.5"
-"@babel/plugin-transform-object-assign@^7.0.0":
+"@babel/plugin-transform-object-assign@^7.0.0", "@babel/plugin-transform-object-assign@^7.16.7":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.18.6.tgz#7830b4b6f83e1374a5afb9f6111bcfaea872cdd2"
integrity sha512-mQisZ3JfqWh2gVXvfqYCAAyRs6+7oev+myBsTwW5RnPhYXOTuCEw2oe3YgxlXMViXUS53lG8koulI7mJ+8JE+A==
@@ -639,7 +654,7 @@
"@babel/helper-validator-option" "^7.21.0"
"@babel/plugin-transform-flow-strip-types" "^7.21.0"
-"@babel/preset-typescript@^7.1.0":
+"@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.16.7":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f"
integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==
@@ -969,6 +984,11 @@
dependencies:
"@types/node" "*"
+"@types/invariant@^2.2.35":
+ version "2.2.35"
+ resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be"
+ integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==
+
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
@@ -2501,6 +2521,11 @@ lodash.debounce@^4.0.8:
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
lodash.throttle@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
@@ -3320,6 +3345,20 @@ react-native-codegen@^0.0.8:
jscodeshift "^0.11.0"
nullthrows "^1.1.1"
+react-native-reanimated@2.9.1:
+ version "2.9.1"
+ resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-2.9.1.tgz#d9a932e312c13c05b4f919e43ebbf76d996e0bc1"
+ integrity sha512-309SIhDBwY4F1n6e5Mr5D1uPZm2ESIcmZsGXHUu8hpKX4oIOlZj2MilTk+kHhi05LjChoJkcpfkstotCJmPRPg==
+ dependencies:
+ "@babel/plugin-proposal-export-namespace-from" "^7.17.12"
+ "@babel/plugin-transform-object-assign" "^7.16.7"
+ "@babel/preset-typescript" "^7.16.7"
+ "@types/invariant" "^2.2.35"
+ invariant "^2.2.4"
+ lodash.isequal "^4.5.0"
+ setimmediate "^1.0.5"
+ string-hash-64 "^1.0.3"
+
react-native@0.67.5:
version "0.67.5"
resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.67.5.tgz#9f2aeabf0766fb4bd5385685f4f4f2406bcdf819"
@@ -3633,6 +3672,11 @@ set-value@^2.0.0, set-value@^2.0.1:
is-plain-object "^2.0.3"
split-string "^3.0.1"
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
setprototypeof@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
@@ -3811,6 +3855,11 @@ stream-buffers@2.2.x:
resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4"
integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==
+string-hash-64@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/string-hash-64/-/string-hash-64-1.0.3.tgz#0deb56df58678640db5c479ccbbb597aaa0de322"
+ integrity sha512-D5OKWKvDhyVWWn2x5Y9b+37NUllks34q1dCDhk/vYcso9fmhs+Tl3KR/gE4v5UNj2UA35cnX4KdVVGkG1deKqw==
+
string-width@^4.1.0, string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
diff --git a/src/index.tsx b/src/index.tsx
index 0e40d95..1eb0f20 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -1,9 +1,6 @@
import React from 'react';
-import {
- requireNativeComponent,
- Platform,
- ViewStyle,
-} from 'react-native';
+import { requireNativeComponent, ViewStyle } from 'react-native';
+// @ts-ignore
import resolveAssetSource from 'react-native/Libraries/Image/resolveAssetSource';
type TransparentVideoProps = {