在React-Native中制作指南针

时间:2016-06-28 13:46:38

标签: javascript react-native ecmascript-6 react-jsx

我试图制作指南针,但我不知道如何使用磁力计的数据。

这是我的班级指南针:

class Compass extends Component {
  constructor(props) {
    super(props);
  }
  componentWillMount(){
    this._animeRotation = new Animated.Value(0);
  }
  componentDidMount() {
      this.startAnimation();
  }
  startAnimation() {
    Animated.timing(this._animeRotation, {
      toValue: this.props.magn, //<-- What put here?
      duration: 1000,
    }).start(() => {
      this.startAnimation();
    });
  }
  render() {
    var interpolatedRotateAnimation = this._animeRotation.interpolate({
      inputRange: [0, 100],
      outputRange: ['0deg', '360deg']
    });
    return (
      <View>
        <Animated.View style={[styles.box, {transform: [{rotate: interpolatedRotateAnimation}]}]}>
          <Image style={styles.box} source={require('./arrow.png')}></Image>
        </Animated.View>
      </View>
    );
  }
}

这是App类:

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      magn: {
        x: 0,
        y: 0,
        z: 0
      }
    };
  }
  componentDidMount() {
    //I can get the gyroscope if is necessary
    SensorManager.startMagnetometer(500);
    // magn is a object with axis z,y and x
    DeviceEventEmitter.addListener('Magnetometer', (magn) => this.setState({magn})); 
  }
  render() {
    return (
      <View>
          <Compass magn={this.state.magn.x}></Compass>
      </View>
    );
  }
}

使用此代码,箭头会旋转但不应该旋转。我必须做什么?

2 个答案:

答案 0 :(得分:2)

数字仅与当前检测到的“磁性北极”有关,该磁场受建筑物中任何铁(例如钢)材料的影响。因此,您首先必须确定什么是真正的北方。

此外,您还需要使用X,Y和Z并获取相对于手机的方向(如果手机是水平或垂直放置,并且是纵向还是横向)。该算法根本不简单。

由于这个原因,我建议您使用现有的包而不是Sensor数据包来获取方向。他们进行计算,并给您一个标题,就像您在动画代码中所期望的那样。另一种可能性是查看这些软件包的开源代码并复制计算结果。

如果您的React Native应用与Expo一起使用,例如它是使用<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.js"></script> <svg id="segmentsGraph"></svg> 命令(CRNA)制作的,则可以使用Create React Native App。这是[示例](Github上的https://github.com/martincarrera/expo-location-example)和here are the docs(查找“标题”部分)。

否则,您可以使用React Native simple compass

答案 1 :(得分:1)

我最终制作了自己的包裹。检查一下:

https://github.com/firofame/react-native-compass-heading