UNPKG

react-native-motion-event-manager

Version:

Extract device motion event to React Native, use native driver to provide high performance.

106 lines (82 loc) 3.25 kB
[English README Here](./README_en.md) react-native-motion-event-manager将device motion导出到RN,它使用了Animated的API和native driver的特性来使UI的更新都在native的UI线程来完成,不用通过RN的bridge,避免了动画的延迟和卡顿 ## 安装 在package.json所在目录运行 ``` npm i react-native-motion-event-manager ``` ### iOS #### Cocoapods安装 然后在iOS的工程目录的Podfile中添加如下代码: ``` pod 'RNMotionEventManager', :path => '/your/path/to/react-native-motion-event-manager' ``` 之后运行`pod install` #### 手动安装 1. 在XCode的project navigator中,右键 `Libraries`,之后点击 `Add Files to [your project's name]` 2. 依次进入目录 `node_modules` `react-native-motion-event-manager` `ios`,然后添加 `RNMotionEventManager.xcodeproj` 3. 在XCode中选择你的target的`Build Phases`,在`Link Binary With Libraries`中添加 `libRNMotionEventManager.a` 4. 在真机上运行工程 ### Android 未完待续 ## 使用 > Not everything you can do with Animated is currently supported in Native Animated. The main limitation is that you can only animate non-layout properties, things like `transform` and `opacity` will work but flexbox and position properties won't. Another one is with `Animated.event`, it will only work with direct events and not bubbling events. This means it does not work with `PanResponder` but does work with things like `ScrollView#onScroll`. 然后在RN中的具体页面,以DeviceMotionModule使用为例,使用代码如下: ``` import { DeviceMotionModule } from 'react-native-motion-event-manager'; class YourClass extends Component { componentDidMount() { // replace with your mapping here let eventMapping = { attitude: { roll: this.state.roll, } }; DeviceMotionModule.startDeviceMotionUpdates(eventMapping); } componentWillUnmount() { DeviceMotionModule.stopDeviceMotionUpdates(); } } ``` 其中`this.state.roll`这个state是一个Animated.Value,之后客户端每次触发motion的更新,就会触发这个Animated.Value的更新 这个Value可以用于构造另外一个Animated.Value或者直接赋予某个element的style例如: ``` <Animated.Text style={{opacity:this.state.roll.interpolate({ inputRange: [-1.5, 1.5], outputRange: [0, 1] })}}> Some text here. </Animated.Text> ``` ## 注意事项 在/node_modules/react-native/Libraries/Animated/src/NativeAnimatedHelper.js里的最后可以找到支持的属性列表: ``` /** * Styles allowed by the native animated implementation. * * In general native animated implementation should support any numeric property that doesn't need * to be updated through the shadow view hierarchy (all non-layout properties). */ const STYLES_WHITELIST = { opacity: true, transform: true, /* legacy android transform properties */ scaleX: true, scaleY: true, translateX: true, translateY: true, }; const TRANSFORM_WHITELIST = { translateX: true, translateY: true, scale: true, scaleX: true, scaleY: true, rotate: true, rotateX: true, rotateY: true, perspective: true, }; ```