Android Sensor Orientation 传感器开发
手机方向图
将手机平放在桌面上来看,手机的左下角是坐标原点,水平向右为x轴,水平向前为y轴,由x轴和y轴正方向叉乘形成的方向
为z轴,当手机平放时,z轴指向天空的方向。
注释:
手机放平:
水平旋转 X坐标变化:手机绕着Z轴旋转的角度,范围0≤value[0]≤360。表示北(North);90表示东(East);180表示南(South);270表示西(West)。
短边翻转 Y坐标变化:手机绕着X轴倾斜或手机翘起的程度,values[1]的取值范围是:-180≤values[1]≤180;
手机屏幕朝上水平放在桌子上:由于很少有桌子是绝对水平的,该值很可能不为0,一般都是-5和5之间的某个值;
手机从顶部抬起,直到将手机沿X轴旋转180度:values[1]会在0到-180之间变化,values[1]的值会逐渐变小,直至 -180;
手机底部抬起,直到将手机沿X轴旋转180度,这时values[1]会在0到180之间变化,values[1]的值会逐渐增大,直到等于+180。
可以利用:values[1]和下面要介绍的values[2]来测量桌子等物体的倾斜度。
长边翻转 Z坐标变化:手机沿着Y轴的滚动角度,范围是-90≤values[2]≤90;
左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。
右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。会逐渐减小到0;
在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化。
android的方向传感器可以获取3个数据。
orientation0:y轴在水平面上的投影偏离正北方向的角度,范围0~359度,正北为0,正东为90,正南为180,正西270。
orientation1:y轴和y轴在水平面上投影之间的角度,即y轴与水平面的夹角。
orientation2:x轴和x轴在水平面上投影之间的角度,即x轴与水平面的夹角。
(3)加速度传感器
android的加速度传感器可以获取3个数据。
accelerometerX:x轴方向的加速度-重力加速度在x轴上的分量。
accelerometerY:y轴方向的加速度-重力加速度在y轴上的分量。
accelerometerZ:z轴方向的加速度-重力加速度在z轴上的分量。
根据上述的两个传感器,能够测量出手机x,y,z轴相对于地面参照系的方向和手机相对于手机参照系的加速度。
因为我们项目的需要,要度量出手机相对于地面参照系的加速度,所以需要进行一些计算。
================================================================================================================
下面说下如何使用:
package com.example.sensor_gravitybackground;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.view.MenuItem;
import android.widget.TextView;public class MainActivity extends Activity implements SensorEventListener{private TextView mOrientation_textview;private SensorManager mSensorManager;private Sensor mSensor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {mOrientation_textview = (TextView) this.findViewById(R.id.orientation_textview);mSensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);}@Overrideprotected void onResume() {super.onResume();//由于传感器监听 费电量,则需要在暂停和从新加载的时候调用,防止后台调用费电量mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL, null);}@Overrideprotected void onPause() {super.onPause();//由于传感器监听 费电量,则需要在暂停和从新加载的时候调用,防止后台调用费电量mSensorManager.unregisterListener(this, mSensor);}@Overridepublic void onSensorChanged(SensorEvent event) {float x=event.values[SensorManager.DATA_X];float y=event.values[SensorManager.DATA_Y];float z=event.values[SensorManager.DATA_Z];mOrientation_textview.setText("x=" + (int) x + "," + "y=" + (int) y + "," + "z=" + (int) z);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}
}
所有传感器的使用模板:
public class SensorActivity extends Activity implements SensorEventListener {private final SensorManager mSensorManager;private final Sensor mAccelerometer;private TextView mOrientation_textview;
private SensorManager mSensorManager;
rivate Sensor mSensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mOrientation_textview = (TextView) this.findViewById(R.id.orientation_textview);mSensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}protected void onResume() {super.onResume();mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);}protected void onPause() {super.onPause();mSensorManager.unregisterListener(this);}public void onAccuracyChanged(Sensor sensor, int accuracy) {}public void onSensorChanged(SensorEvent event) {}}
=====================================================================
上面代码解释:
下面是API中定义的几个代表sensor的常量。
Int | TYPE_ACCELEROMETER | A constant describing an accelerometer sensor type. 加速度传感器 |
int | TYPE_ALL | A constant describing all sensor types. 所有类型 A constant describing all sensor types. |
int | TYPE_GRAVITY | A constant describing a gravity sensor type. |
int | TYPE_GYROSCOPE | A constant describing a gyroscope sensor type 回转仪传感器 |
int | TYPE_LIGHT | A constant describing an light sensor type.光线传感器 |
int | TYPE_LINEAR_ACCELERATION | A constant describing a linear acceleration sensor type. |
int | TYPE_MAGNETIC_FIELD | A constant describing a magnetic field sensor type.磁场传感器 |
int | TYPE_ORIENTATION |
This constant is deprecated. use SensorManager.getOrientation() instead. |
int | TYPE_PRESSURE | A constant describing a pressure sensor type 压力计传感器 |
int | TYPE_PROXIMITY | A constant describing an proximity sensor type.距离传感器 |
int | TYPE_ROTATION_VECTOR | A constant describing a rotation vector sensor type. |
int | TYPE_TEMPERATURE | A constant describing a temperature sensor type 温度传感器 |
我们在编写传感器相关的代码时可以按照以下步骤:
第一步: 获得传感器管理器
SensorManger sm = (SensorManager).getSystemService(SENSOR_SERVICE);
第二步:为具体的传感器注册监听器 ,这里我们使用磁阻传感器Sensor.TYPE_ORIENTATION.
sm,registerListener (this,sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST);
这里如果想注册其他的传感器,可以改变第一个参数值的传感器类型属性。我们应该根据手机中的实际存在的传感器来进行注册。如果手机中
不存在我们注册的传感器,就算我们注册了也不起什么作用。
第三个参数值表示获得传感器数据的速度,SENSOR_DELAY_FASTEST表示尽可能快的获取传感器数据,除了该值以外,还可以设置3个获取
传感器数据的速度值,这些值如下:
SENSOR_DELAY_GAME 如果利用传感器开发游戏,建议使用该值。 一般大多数实时行较高的游戏使用该级别。
SENSOR_DELAY_NORMAL 默认的获取传感器数据的速度。标准延迟,对于一般的益智类游戏或者EASY界别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧的现象。
SENSOR_DELAY_UI 若使用传感器更新UI, 建议使用该值。
SENSOR_DELAY_FASTEST:最低延迟,一般不是特别灵敏的处理不推荐使用,该模式可能造成手机电力大量消耗,而且由于传递的为大量的原始数据,算法处理不好将会影响游戏逻辑和UI的性能。
第三步,既然我们在第二部已经为传感器设置了监听。我们就要实现具体的监听方法,在android 中,应用程序使用传感器主要依赖于 android.hardware.SensorEventListener 接口。该接口可以监听传感器各种事件。
====================================================================================================
下面是values变量的元素在主要的传感器中所代表的含义。
1.1方向传感器
在方向传感器中values变量的3个值都表示度数,它们的含义如下:
values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘,实例76将详细介绍电子罗盘的实现过程。
values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1]
≤180。假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values[1]的值应该是0(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)。这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values[1]会在0到-180之间变化,也就是说,从手机顶部抬起时,values[1]的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values[1]会在0到180之间变化。也就是
values[1]的值会逐渐增大,直到等于180。可以利用values[1]和下面要介绍的values[2]来测量桌子等物体的倾斜度。
values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values[2]的值应为0。将手机左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。将手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化。
1.2加速传感器
该传感器的values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧向右侧移动,values[0]为负值;从右向左移动,values[0]为正值。读者可以通过本节的例子来体会加速传感器中的值的变化。要想使用相应的传感器,仅实现SensorEventListener接口是不够的,还需要使用下面的代码来注册相应的传感器。
// 获得传感器管理器
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
// 注册方向传感器
sm.registerListener(this,
sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_FASTEST);
如果想注册其他的传感器,可以改变getDefaultSensor方法的第1个参数值,例如,注册加速传感器可以使用Sensor.TYPE_ACCELEROMETER。在Sensor类中还定义了很多传感器常量,但要根据手机中实际的硬件配置来注册传感器。如果手机中没有相应的传感器硬件,就算注册了相应的传感器也不起任何作用。getDefaultSensor方法的第2个参数表示获得传感器数据的速度。SensorManager.SENSOR_DELAY_ FASTEST表示尽可能快地获得传感器数据。除了该值以外,还可以设置3个获得传感器数据的速度值,这些值如下:
SensorManager.SENSOR_DELAY_NORMAL:默认的获得传感器数据的速度。
SensorManager.SENSOR_DELAY_GAME:如果利用传感器开发游戏,建议使用该值。
SensorManager.SENSOR_DELAY_UI:如果使用传感器更新UI中的数据,建议使用该值。
1.3重力感应器
加速度传感器的类型常量是Sensor.TYPE_GRAVITY。重力传感器与加速度传感器使用同一套坐标系。values数组中三个元素分别表示了X、Y、Z轴的重力大小。Android SDK定义了一些常量,用于表示星系中行星、卫星和太阳表面的重力。下面就来温习一下天文知识,将来如果在地球以外用Android手机,也许会用得上。
public static final float GRAVITY_SUN= 275.0f;
public static final float GRAVITY_MERCURY= 3.70f;
public static final float GRAVITY_VENUS= 8.87f;
public static final float GRAVITY_EARTH= 9.80665f;
public static final float GRAVITY_MOON= 1.6f;
public static final float GRAVITY_MARS= 3.71f;
public static final float GRAVITY_JUPITER= 23.12f;
public static final float GRAVITY_SATURN= 8.96f;
public static final float GRAVITY_URANUS= 8.69f;
public static final float GRAVITY_NEPTUNE= 11.0f;
public static final float GRAVITY_PLUTO= 0.6f;
public static final float GRAVITY_DEATH_STAR_I= 0.000000353036145f;
public static final float GRAVITY_THE_ISLAND= 4.815162342f;
1.4 光线传感器
光线传感器的类型常量是Sensor.TYPE_LIGHT。values数组只有第一个元素(values[0])有意义。表示光线的强度。最大的值是120000.0f。Android SDK将光线强度分为不同的等级,每一个等级的最大值由一个常量表示,这些常量都定义在SensorManager类中,代码如下:
public static final float LIGHT_SUNLIGHT_MAX =120000.0f;
public static final float LIGHT_SUNLIGHT=110000.0f;
public static final float LIGHT_SHADE=20000.0f;
public static final float LIGHT_OVERCAST= 10000.0f;
public static final float LIGHT_SUNRISE= 400.0f;
public static final float LIGHT_CLOUDY= 100.0f;
public static final float LIGHT_FULLMOON= 0.25f;
public static final float LIGHT_NO_MOON= 0.001f;
上面的八个常量只是临界值。读者在实际使用光线传感器时要根据实际情况确定一个范围。例如,当太阳逐渐升起时,values[0]的值很可能会超过LIGHT_SUNRISE,当values[0]的值逐渐增大时,就会逐渐越过LIGHT_OVERCAST,而达到LIGHT_SHADE,当然,如果天特别好的话,也可能会达到LIGHT_SUNLIGHT,甚至更高。
1.5陀螺仪传感器
陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:values[0]:延X轴旋转的角速度。
values[1]:延Y轴旋转的角速度。
values[2]:延Z轴旋转的角速度。
当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。陀螺仪传感器经常被用来计算手机已转动的角度,代码如下:
private static final float NS2S = 1.0f / 1000000000.0f;
private float timestamp;
public void onSensorChanged(SensorEvent event)
{
if (timestamp != 0)
{
// event.timesamp表示当前的时间,单位是纳秒(1百万分之一毫秒)
final float dT = (event.timestamp - timestamp) * NS2S;
angle[0] += event.values[0] * dT;
angle[1] += event.values[1] * dT;
angle[2] += event.values[2] * dT;
}
timestamp = event.timestamp;
}
上面代码中通过陀螺仪传感器相邻两次获得数据的时间差(dT)来分别计算在这段时间内手机延X、 Y、Z轴旋转的角度,并将值分别累加到angle数组的不同元素上。
1.6其他传感器
其他传感器在前面几节介绍了加速度传感器、重力传感器、光线传感器、陀螺仪传感器以及方向传感器。除了这些传感器外,Android SDK还支持如下的几种传感器。关于这些传感器的使用方法以及与这些传感器相关的常量、方法,读者可以参阅官方文档。
近程传感器(Sensor.TYPE_PROXIMITY)
线性加速度传感器(Sensor.TYPE_LINEAR_ACCELERATION)
旋转向量传感器(Sensor.TYPE_ROTATION_VECTOR)
磁场传感器(Sensor.TYPE_MAGNETIC_FIELD)
压力传感器(Sensor.TYPE_PRESSURE)
温度传感器(Sensor.TYPE_TEMPERATURE)
虽然AndroidSDK定义了十多种传感器,但并不是每一部手机都完全支持这些传感器。例如,Google Nexus S支持其中的9种传感器(不支持压力和温度传感器),而HTC G7只支持其中的5种传感器。如果使用了手机不支持的传感器,一般不会抛出异常,但也无法获得传感器传回的数据。读者在使用传感器时最好先判断当前的手机是否支持所使用的传感器。
详细使用:见博客:http://www.android100.org/html/201502/21/122191.html;
其实开发过程使用的就是上面那个
Android Sensor Orientation 传感器开发相关推荐
- android系统重力感应传感器 方向控制与方向切换,android sensor orientation 方向传感器 重力感应...
首先,获取方向传感器(参照http://developer.android.com/reference/android/hardware/SensorManager.html): publicclas ...
- Android学习笔记-传感器开发之利用传感器和Tween开发简易指南针
本次我们学习Android传感器的开发,前面已经介绍过了,tween的使用,所以,我们可以结合传感器与tween动画,开发简易的指南针. 首先先介绍一下传感器的相关知识, 在Android应用程序中使 ...
- android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...
本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...
- Android移动开发-利用加速度传感器开发仿微信摇一摇功能的实现
加速度传感器是最常见的传感器,大部分Android手机都内置了加速度传感器,加速度传感器运用最广泛的功能就是微信的摇一摇功能,用户通过摇晃手机寻找周围的人,其它类似的应用还摇骰子.玩游戏等. 下面以摇 ...
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/344.html 前 ...
- Android传感器开发详解
效果图: 连接真机Milestone,编译并运行程序,显示结果如下: 结合程序我们做一些解释. 1)Android所有的传感器都归传感器管理器 SensorManager 管理,获取传感器管理器的 ...
- Android 传感器开发详解
Android 传感器开发详解 本文转载自:https://blog.csdn.net/airsaid/article/details/52902299 前言 使用 第一步 第二步 第三步 方向传感器 ...
- Android Sensor 传感器总结
ref:https://www.jianshu.com/p/8440a5897944 https://developer.android.google.cn/guide/topics/sensors/ ...
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi ) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/andr ...
最新文章
- 最新架构amd服务器cpu,AMD Zen架构处理器全新性能配置介绍
- 技术干货 | jsAPI 方式下的导航栏的动态化修改
- linux下make 文件写法之简单函数调用
- 蓝牙怎么区分单模和双模_小院闲聊#01#——蓝牙的发展和不同蓝牙之间的关系...
- 通过HTTP协议发送远程消息
- javaScript深克隆(deepClone(origin,target))
- c语言程序设计 k,《C语言程序设计》谭浩强版-教学教案 k.doc
- 数字集群通信的业务与功能
- GB2312 简体中文编码表
- jd-gui反编译中文乱码
- 计算机视觉实验四-相机标定
- 德州理工大学计算机科学专业录取,美国留学:德州理工大学录取要求
- OSChina 周六乱弹 —— 网恋有风险面基需谨慎
- vscode markdown 导出PDF错误
- TCP/IP 模型 与 OSI 七层模型的对应关系
- 蓝牙配对码配置错误_漏洞问题频发,你还敢开你的蓝牙吗?
- 基于FPGA的电子密码锁
- 广外计算机学院在哪个校区,广东外语外贸大学有几个校区及校区地址 哪个校区最好...
- jmeter安装与介绍
- 【免费程序分享】Discuz仿手游控游戏论坛商业版网站模板/Discuz游戏论坛网站模板
热门文章
- 超级计算机为什么不能玩游戏,韦杰:东方文明像一台超级计算机,不能只用来玩游戏...
- FineBI 将聚合之后的结果,再求平均值
- CRC校验 java modbus
- onchange()事件的应用
- 学生管理系统(添加、查看、删除、修改学生信息)
- c语言用赫夫曼编码压缩文件,用哈夫曼编码C语言实现文件压缩
- 1亿数据 redis 内存_Redis10亿数据量只需要100MB内存,为什么这么牛?
- Python 网络爬虫实战:猫眼电影 38950 条评论数据告诉你《无名之辈》是否值得一看?
- VScode创建第一个C++项目
- ArcBlock ⑪ 月报 | 无惧寒冬 ABT 2019 区块链远征启程