文档章节

Sensor.TYPE_ORIENTATION 方向传感器,转向晕了个头

短短的歼击机
 短短的歼击机
发布于 2015/12/01 20:52
字数 1267
阅读 156
收藏 1
先铺出一列参考文,我觉得都不错的,虽然我要的功能很简单的说。最后补充上自己备忘的一小点内容《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,图文我都借用了一下.,
Android笔记37: Sensor.TYPE_ORIENTATION 方向传感器,转向晕了个头 - 恶 - 早衰男的巢 
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;
... ...

    /** Called when the activity is first created. */
    @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三轴的值和应用或手机设置的横屏或竖屏无关的。也就是说不必做翻转屏的坐标转换。但要考虑握持手机的方向修正。

© 著作权归作者所有

短短的歼击机

短短的歼击机

粉丝 82
博文 268
码字总数 269797
作品 0
武汉
高级程序员
私信 提问
Android学习之教你五步搞定Sensor,让程序更酷

首先介绍下,啥叫传感器。 Sensor(传感器): 维基百科告诉我:传感器是接收信号或刺激并反应的器件,能将待测物理量或化学量转换成另一对应输出的装置。 比如:重力传感器,方向传感器 An...

qq_41405257
2018/05/29
0
0
Android开发之方向传感器的使用

Android中的方向传感器在生活中是一个很好的应用,典型的例子是指南针的使用,我们先来简单介绍一下传感器中三个参数x,y,z的含义,以一幅图来说明。 图 1 补充说明:图中的坐标轴x,y,z和传感器...

Airship
2015/03/05
6.4K
0
利用传感器实现微信的摇一摇功能

现在的不少应用都用到了摇动手机改变内容的功能,比如微信中的“摇一摇”功能。前两天要实现这个功能,稍微看了一下关于传感器Sensor的内容。 传感器有几种类型: 方向传感器: Sensor.TYPE_...

rice.mashujun
2012/03/07
1K
2
《Android应用开发揭秘》传感器和语音识别

第9章 Android特色开发 Android 是一个面向应用程序开发的丰富平台,它拥有许多具有吸引力的用户界面元素、数据管理和网络应用等优秀的功能。Android 还提供了很多颇具特色的接口。本章我们将...

鉴客
2011/12/01
3.3K
4
实现Sensor.TYPE_ROTATION_VECTOR传感器的android源代码在哪里?

在android的sensor中想Sensor.TYPE_ROTATION_VECTOR、Sensor.TYPE_GRAVITY等传感器是虚拟出来的,使用的是其他传感器生成的数据,因此我想找一下实现的代码学习学习,我已经找到了Sensor.TY...

jimielee
2015/10/16
2.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
今天
13
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
4
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.3K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部