import * as ScreenOrientation from 'expo-screen-orientation'; import { Accelerometer } from 'expo-sensors'; import React from 'react'; import { ActivityIndicator, Animated, Button, Dimensions, StyleSheet, Text, View, } from 'react-native'; import { Colors } from '../constants'; const COUNT = 5; const ITEM_SIZE = Dimensions.get('window').width / COUNT; interface Props { numItems: number; perspective: number; } function useLockedScreenOrientation() { React.useEffect(() => { ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT_UP).catch(() => null); return () => { ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.ALL).catch(() => null); }; }, []); } export default function AccelerometerScreen({ numItems = COUNT, perspective = 200 }: Props) { useLockedScreenOrientation(); const [items, setItems] = React.useState([]); const [error, setError] = React.useState(null); const [isSetup, setSetup] = React.useState(false); React.useEffect(() => { const items = []; for (let i = 0; i < numItems; i++) { items.push({ position: new Animated.ValueXY() }); } setItems(items); }, [numItems]); React.useEffect(() => { (async () => { const { status } = await Accelerometer.getPermissionsAsync(); if (status === 'denied') { setError(`Cannot start demo!\nMotion permission is ${status}.`); } else if (status === 'undetermined') { return; } if (!(await Accelerometer.isAvailableAsync())) { setError('Accelerometer is not available on this device!'); return; } setSetup(true); })(); }, []); React.useEffect(() => { if (!isSetup) return; const sub = Accelerometer.addListener(({ x, y }) => { // console.log('event'); items.forEach((_, index) => { // All that matters is that the values are the same on iOS, Android, Web, ect... const nIndex = index + 1; Animated.spring(items[index].position, { toValue: { x: (Number(x.toFixed(1)) * perspective * nIndex) / COUNT, y: (-y.toFixed(1) * perspective * nIndex) / COUNT, }, useNativeDriver: false, friction: 7, }).start(); }); }); return () => sub.remove(); }, [isSetup]); if (error) { return ( {error} ); } if (!isSetup) { return ( Checking Permissions