不错的文章转载自:http://snmoney.blog.163.com/blog/static/440058201191741427884/

先铺出一列参考文,我觉得都不错的,虽然我要的功能很简单的说。最后补充上自己备忘的一小点内容
《android 方向传感器》 http://hi.baidu.com/dean_wang/blog/item/7662a8f8e5efe3c4b58f312b.html
《深入探讨 Android 传感器》http://www.ibm.com/developerworks/cn/opensource/os-android-sensor/
《官方文档》http://developer.android.com/reference/android/hardware/SensorManager.html
《Android Orientation Sensor tutorial》http://blog.androgames.net/135/android-orientation-tutorial/
《Android方向传感器实践——自己动手做水平尺》http://blog.csdn.net/tinya0913/article/details/6095307

ok,图文我都借用了一下.,

x 方向就是手机的水平方向,右为正
y 方向就是手机的水平垂直方向,前为正
z 方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负
方向角的定义是手机y轴 水平面上的投影 与 正北方向的夹角。 (值得范围是 0 ~ 359 其中0=North, 90=East, 180=South, 270=West)
倾斜角的定义是手机y轴 与水平面的夹角 (手机z轴向y轴方向移动为正 ,值得范围是 -180 ~ 180)
旋转角的定义是手机x轴 与水平面的夹角 (手机x轴离开z轴方向为正, 值得范围是 -90 ~ 90)
也就是说,当你把手机水平放置在桌面上(屏幕向上)且手机指向正北(Y轴方向),此时传感器获得的xyz三个值应该都为0。

以上是我在较早一段时间前已经掌握到的知识。

现在我的疑问是,我手头有个项目需要用户以DC的姿势握持设备(横握x轴向上,z轴屏幕面向用户),这个时候,传感器对xyz三轴的定义会否变化呢?
代码如下:

1. 首先修改 Manifest.xml,使应用以横屏显示

<activity android:name=" SensorTest "android:label="@string/app_name"
android:screenOrientation="landscape">

2. 再看源码,加入方向传感器的部分

public class SensorTest extends Activity implements SensorEventListener {
//定义SensorManager  
private SensorManager  mSM; 
private boolean   mRegisteredSensor;
... ...

   
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

//方向传感器,获取lisener在onResume()
mSM = (SensorManager)getSystemService(SENSOR_SERVICE);

... ...
}

@Override
public void onResume(){
super.onResume();
List<Sensor> sensors = mSM.getSensorList(Sensor.TYPE_ORIENTATION);
         if (sensors.size() > 0){ 
            Sensor sensor = sensors.get(0);
             mRegisteredSensor = mSM.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
         } else{} //如果这台设备不具备方向传感器..这里就获取不到sensors
}
@Override
public void onPause(){
 if (mRegisteredSensor){ //注销Listener
            mSM.unregisterListener(this);
            mRegisteredSensor = false;
         }
super.onPause();
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
//方向传感器改变方向时
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
//获得三轴的数值
float x = event.values[SensorManager.DATA_X]; 
float y = event.values[SensorManager.DATA_Y]; 
float z = event.values[SensorManager.DATA_Z];

//输出调试信息至app的标题栏
setTitle(“x,y,z:("+x+","+y+","+z+")”);
}

}

//-----------以上代码省略了不少无关的东西----------------
为Class SensorTest 添加  implements SensorEventListener 后,eclipse 提示自动补充了两个方法
public void  onAccuracyChanged() 这是当传感器的精度改变时触发的,我暂时还用不上
和 public void  onSensorChanged() 这个是我需要的,获得三轴角度的数据,具体用法见上例

这个时候还不能得到数据,还需要为 SensorManager  设置一个Listener, 具体见 onResume() ;
相应地,我还在onPause() 对这个Listener 注销。

ok,那么就可以试运行了,横握手机水平稳定地改变方向,发现变更数值的是x轴值。
很郁闷的是读数和上文的x轴定义不一样,当我机背摄像头正对东面的时候x显示0??.. 0不是应该是正北么?
试了不同的方向,发现角度都有恒定的90的偏差值....(这不是误差吧?大吃一斤)
修改了一下Manifest,改成竖屏,这下x的值变得更怪了..很飘~而且读不懂和横屏之间的数值差异

... ... 苦思片刻...茅塞顿开,我擦!我已开始对上面第一段xyz轴的读数理解错了!
x的确是方向,作为罗盘时正确放置或握持方式是像上文所说的水平屏幕朝上,手机顶部指示(沿y轴方向)的x夹角;
而我这个项目要求是以机背摄像头的指示方向作为参考基准(也就是沿z轴的负方向),那么得到的x值依然是代表方向,只是存在那个一开始搞不懂的-90度误差

简单地说就是水平伸出左手手掌,掌心向上拇指伸直;这个时候如果中指代表的是摄像头的方向,那么原y轴也就是x值的参考坐标是拇指指向的方向。那自然是存在-90度的偏差。哈哈哈,

结论就是xyz三轴的值和应用或手机设置的横屏或竖屏无关的。也就是说不必做翻转屏的坐标转换。但要考虑握持手机的方向修正。

关于Android的方向传感器相关推荐

  1. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  2. Android 利用方向传感器获得手机的相对角度

    1.android 的坐标系是如何定义x, y z 轴的. x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始 ...

  3. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  4. Android笔记 方向传感器

    1传感器概念 图片资源来自传智播客张泽华视频114集 demo 1布局一张图片 网上随便找一张指南针图片 <RelativeLayout xmlns:android="http://s ...

  5. Android利用方向传感器获得手机的相对角度实例说明

    1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始沿 ...

  6. Android基于方向传感器实现指南针功能

    这里做了一个指南针,主要用到了Android里的加速度传感器和地磁传感器 Github源码 1.数据初始化 private USensor(Context context) {if (sorMgr = ...

  7. android 横盘方向传感器,横盘震荡选择方向!

    2020.10.15日 上证指数: 大盘已经连续3天盘整了,而且这三天还是逐渐下行的态势. 今天冲高后又被打下来,显得有气无力.按理说上面的缺口不远了,很容易就能补上,不知道主力是怎么想的,这里到底是 ...

  8. Android方向传感器的相关问题

    android的方向传感器Sensor.TYPE_ORIENTATION(已过时,实测新方法得到的结果和旧方法一致) 三个值分别表示: value[0] 方向角,用来测方向 value[1] 垂直方向 ...

  9. Android Sensor Orientation 传感器开发

    手机方向图 将手机平放在桌面上来看,手机的左下角是坐标原点,水平向右为x轴,水平向前为y轴,由x轴和y轴正方向叉乘形成的方向 为z轴,当手机平放时,z轴指向天空的方向. 注释: 手机放平: 水平旋转 ...

  10. Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37730469 在上一篇博客中,我们成功把地图导入了我们的项目.本篇我们准备为地图 ...

最新文章

  1. 使用libevent多线程验证Linux上的服务器惊群现象
  2. 如何用c语言读取硬盘串号_如何用C语言实现OOP
  3. 信号处理之频谱原理与python实现
  4. React.js入门笔记
  5. SIGIR 2021|重新思考Attention在CTR预估中作用
  6. SparkSQL程序设计
  7. 【转】Fresco之强大之余的痛楚
  8. 大数据实战之环境搭建(十)
  9. 微软官方首度回应黑屏恐慌:不强制 不诉讼
  10. Solidity编程 五 之 数据类型
  11. Sobel边缘检测算法原理
  12. 服务器lsass占用内存_记一次服务器病毒查杀过程:lsass.exe占用内存高
  13. 重写和重载的区别是什么
  14. 公司内网限制qq微信登陆--解决办法
  15. Deep learning-based method coupled with small sample learning for solving partial differential equat
  16. 王小锤学Java:retainAll函数那点儿事
  17. 真正从零开始搭建网站—宝塔面板+wordpress(超详细教程)
  18. 物联网安全知识点总结--第六章 物联网应用层安全
  19. 运维管理系统,效果稳定、可靠运行
  20. 先锋系何以失控?去年6月起就已经出现资金链紧张的迹象

热门文章

  1. 如何解决:微云下载文件总是下载失败
  2. php 合并多个pdf,快速查阅多个PDF文件,这2个PDF合并技巧要学会!
  3. kubectl 命令详解(三十四):rollout status
  4. golang开发:go并发的建议
  5. [转]小总结一下矩阵的对角化
  6. 华为od机试81出租车计费python
  7. 安卓pdf阅读器_推荐一款手机PDF阅读器、编辑器xodo docs安卓版
  8. 适者生存还是强者生存
  9. html怎么引用网页链接,浅谈网页中各种链接引用方法
  10. 图像宽度所占字节必须是4的倍数详解