Android方向传感器

news/2024/7/7 15:44:21 标签: 移动开发

在应用程序中使用SensorManager.getOrientation()来获得原始数据。

public static float[] getOrientation (float[] R, float[] values)
  1. 第一个参数是R用来保存磁场和加速度的数据,通过该函数获取方位角。
  2. 第二个参数是函数输出,数据自动填充。
  • values[0]:方向角,但用(磁场+加速度)得到的数据范围是(-180~180),也就是说,0表示正北,90表示正东,180/-180表示正南,-90表示正西。而直接通过方向感应器数据范围是(0~359)360/0表示正北,90表示正东,180表示正南,270表示正西。
  • values[1]:pitch 倾斜角即由静止状态开始,前后翻转,手机顶部往上抬起(0~-90),手机尾部往上抬起(0~90)
  • values[2]:roll 旋转角 即由静止状态开始,左右翻转,手机左侧抬起(0~90),手机右侧抬起(0~-90)

通过函数getRotationMatrix获取R

public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)

注册监听

sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_GAME);  
sensorManager.registerListener(this, mag_sensor,SensorManager.SENSOR_DELAY_GAME);  

主要代码

import android.app.Activity;  
import android.hardware.Sensor;  
import android.hardware.SensorEvent;  
import android.hardware.SensorEventListener;  
import android.hardware.SensorManager;  
import android.os.Bundle;  
import android.view.Menu;  
import android.widget.TextView;  
 
public class MainActivity extends Activity implements SensorEventListener{  
  
    private SensorManager sensorManager;  
    private Sensor acc_sensor;  
    private Sensor mag_sensor;  
    //加速度传感器数据  
    float accValues[] = new float[3];  
    //地磁传感器数据  
    float magValues[] = new float[3];  
    //旋转矩阵,用来保存磁场和加速度的数据  
    float r[] = new float[9];  
    //模拟方向传感器的数据(原始数据为弧度)  
    float values[] = new float[3];  
    TextView showTV = null;  
    
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        show_change=(TextView) findViewById(R.id.show_change);  
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
        acc_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  
        mag_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);  
        // 注册监听:  
        sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_GAME);  
        sensorManager.registerListener(this, mag_sensor,SensorManager.SENSOR_DELAY_GAME);  
    }  
  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.main, menu);  
        return true;  
    }
      
    // 回调方法  
    @Override  
    public void onSensorChanged(SensorEvent event) {  
        if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){  
            accValues = event.values.clone();
        }  
        else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){  
            magValues = event.values.clone();
        }
        
        /**
         * r:要填充的旋转数组 
         * I: 将磁场数据转换进实际的重力坐标中,一般默认情况下可以设置为null 
         * gravity: 加速度传感器数据 
         * geomagnetic:地磁传感器数据 
         */  
        SensorManager.getRotationMatrix(r, null, accValues, magValues);
          
        /** 
         * R:旋转数组 
         * values:模拟方向传感器的数据 
         */  
        SensorManager.getOrientation(r, values);  
         
        //将弧度转化为角度后输出  
        StringBuffer buff = new StringBuffer();  
        for(float value : values){  
            value=(float) Math.toDegrees(value);  
            buff.append(value + "  ");  
        }  
        
        showTV.setText(buff.toString());     
    }  
      
    @Override  
    public void onAccuracyChanged(Sensor sensor, int accuracy) {  
    } 
}  

http://www.niftyadmin.cn/n/1214777.html

相关文章

Stale branches 设置_N卡和A卡怎么设置高性能模式|独立显卡怎么设置最佳

显卡默认情况下是不开启高性能模式的,因为除了游戏发烧户,应该很少有用户能用得上这样的一个功能,不过如果大家在运行大型游戏、程序上有点吃力的时候,可以尝试开启显卡的高性能模式,提升体验。这篇文章是系统部落根据…

linux技术咨询,Linux技术咨询委员会已完成对UMN内核漏洞植入事件的调查

此前为了一个处心积虑的 Linux 安全研究项目,两名 UMN 研究人员故意向 Linux 内核插入了有后门漏洞的补丁。事件曝光后,其立即遭到了 Linux 及安全社区的炮轰。最新消息是,由顶级 Linux 内核开发人员组成的 Linux 基金会技术咨询委员会&#…

CF896C Willem, Chtholly and Seniorious(珂朵莉树)

中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下&#xff08;逃 1 //minamoto2 #include<bits/stdc.h>3 #define IT set<node>::iterator4 #define ll long long5 using namespace std;6 const int mod71e97,mo…

电脑能上网手机连上wifi不能上网_如何通过 iPhone 手机流量给 Windows 电脑上网(不需要 WiFi 接收器、不需要蓝牙)...

很简单&#xff0c;就三个步骤&#xff1a;找一台有网的电脑先下载好 itunes把 itunes 安装到需要上网的 windows 电脑上跟着下面几张图一起操作就好啦~

c语言中srand的作用,C++随机数(rand和srand)函数用法详解

C 提供了一组函数以生成和使用随机数字。随机数字就是从一组可能的值中进行随机选择而获得的一个值。该组中的值都有相同的被选中的几率。随机数字常用于许多不同类型的程序中&#xff0c;以下是一些示例&#xff1a;计算机游戏通常要使用随机数字来模拟一些随机过程&#xff0…

常用的shell脚本

1.启动脚本 start.sh #!/bin/bash nohup java -Xmx512m -Xms128m -jar /home/apps/SzjjServices/SzjjServices-1.0.0.jar >/dev/null 2>&1 &2.关闭脚本 stop.sh #!/bin/bash pidps -ef | grep "Szjj" | grep -v grep | awk {print $2} if [ -n "…

C语言 参数检查,C语言isatty()函数:检查给定的设备类型

函数名&#xff1a;isatty头文件&#xff1a;函数原型&#xff1a; int isatty(int handle);功能&#xff1a; 检查给定的设备类型参数&#xff1a;int handle 为要检查的设备文件句柄返回值&#xff1a; 普通文件 返回0 &#xff0c;设备 返回-1补充&#xff1a;常用设备名…

为什么苹果6没有录屏_为什么安卓的消息推送没有苹果好用?

最近有小朋友问我&#xff1a;“缺姐姐&#xff0c;缺姐姐&#xff0c;为什么我从苹果手机换成安卓手机后收到消息经常延迟&#xff0c;甚至收不到呢&#xff1f;太误事了。”其实这是ios系统和Android系统推送机制不同导致的&#xff0c;那我就简单讲讲二者的不同吧。iOS的推送…