What’s device coordinate frame?




react-native-sensors
Detect device shake
import {
accelerometer,
setUpdateIntervalForType,
SensorTypes,
} from 'react-native-sensors';
import {map, filter} from 'rxjs/operators';
...
const [lastShakeTime, setLastShakeTime] = useState(0);
useEffect(() => {
const SHAKE_THRESHOLD = 10; // This is shake sensitivity - lowering this will give high sensitivity and increasing this will give lower sensitivity
const MIN_TIME_BETWEEN_SHAKES_MILLISECS = 1000;
setUpdateIntervalForType(SensorTypes.accelerometer, 200);
const subscription = accelerometer
.pipe(
map(
({x, y, z}) =>
Math.sqrt(
Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2),
) /* - SensorManager.GRAVITY_EARTH */,
),
filter((acceleration) => acceleration > SHAKE_THRESHOLD),
)
.subscribe((acceleration) => {
const curTime = new Date().getTime();
if (curTime - lastShakeTime > MIN_TIME_BETWEEN_SHAKES_MILLISECS) {
setLastShakeTime(curTime);
console.log('Shaked device! acceleration: ', acceleration);
}
});
return () => {
subscription.unsubscribe();
};
});
But build is error in iOS !!
expo-sensors
Installation
- Install “react-native-unimodules” installing-unimodules
- Install “expo-sensors” existing-apps
yarn add expo-sensors
npx pod-install
Detect device shake
import { Accelerometer } from 'expo-sensors';
...
useEffect(() => {
addSensorListener(() => {
//add your code here
console.log('Shake Shake Shake');
});
return () => {
removeListener();
};
});
const addSensorListener = (handler) => {
//this is shake sensitivity - lowering this will give high sensitivity and increasing this will give lower sensitivity
const THRESHOLD = 1;
let last_x, last_y, last_z;
let lastUpdate = 0;
Accelerometer.addListener((accelerometerData) => {
let { x, y, z } = accelerometerData;
let currTime = Date.now();
if (currTime - lastUpdate > 100) {
let diffTime = currTime - lastUpdate;
lastUpdate = currTime;
let speed =
(Math.abs(x + y + z - last_x - last_y - last_z) / diffTime) * 10000;
if (speed > THRESHOLD) {
handler();
}
last_x = x;
last_y = y;
last_z = z;
}
});
};
const removeListener = () => {
Accelerometer.removeAllListeners();
};
Leave a Reply