android 获取设备旋转角度,获取Android设备的方向,Sensor和SensorManager实现手机旋转角度...

本文介绍了如何在Android中利用Sensor和SensorManager获取设备的运动加速度,进而计算设备相对于地面的方向。通过处理SensorEvent的x、y、z轴加速度分量,可以计算出设备在x-y平面上的旋转角度,用于实现如水平尺应用的功能。示例代码展示了一个简单的"不倒翁"Demo,演示了设备旋转时UI的实时更新。
摘要由CSDN通过智能技术生成

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1009/425.html

带有g-sensor的Android设备上可通过API获取到设备的运动加速度,应用程序通过一些假设和运算,可以从加速度计算出设备的方向

获取设备运动加速度的基本代码是:

SensorManagersm =(SensorManager)context.getSystemService(Context.SENSOR_SERVICE);

sm.registerListener(newSensorEventListener(){

publicvoidonSensorChanged(SensorEventevent){

if(Sensor.TYPE_ACCELEROMETER !=event.sensor.getType()){

return;

}

float[]values =event.values;

floatax =values[0];

floatay =values[1];

floataz =values[2];

// TODO Have fun with the acceleration components...

}

publicvoidonAccuracyChanged(Sensorsensor,intaccuracy){

}

},sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);

SendorEventListener 通过 SendorEvent 回调参数获得当前设备在坐标系x、y、z轴上的加速度分量。SensorEvent 的 api doc 中定义了这里使用的坐标系为:

10ef9cf0a18196e6cfe3479b7a6aca1c.png

我暂且称之为“设备坐标系”吧,设备坐标系是固定于设备的,与设备的方向(在世界坐标系中的朝向)无关

精确地说,Sensor Event 所提供的加速度数值,是设备以地球为参照物的加速度减去重力加速度的叠加后的值。我是这样理解的:当以重力加速度g向地面作自由落体运动时,手机处于失重状态,g-sensor以这种状态作为加速度的0ÿ

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
Android提供了一些传感器API来获取手机的运动方向角度。其中,最常用的是重力感应器和磁场感应器。 重力感应器可以用来检测手机的倾斜和旋转,可以通过以下代码获取手机的加速度和重力加速度: ``` SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); Sensor gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); sensorManager.registerListener(new SensorEventListener() { float[] gravity = new float[3]; float[] linear_acceleration = new float[3]; @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_GRAVITY) gravity = event.values.clone(); if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { final float alpha = 0.8f; gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; linear_acceleration[0] = event.values[0] - gravity[0]; linear_acceleration[1] = event.values[1] - gravity[1]; linear_acceleration[2] = event.values[2] - gravity[2]; // 计算手机的倾斜角度 float xAngle = (float) Math.atan2(linear_acceleration[1], linear_acceleration[2]) * 180 / (float) Math.PI; float yAngle = (float) Math.atan2(linear_acceleration[0], linear_acceleration[2]) * 180 / (float) Math.PI; float zAngle = (float) Math.atan2(linear_acceleration[0], linear_acceleration[1]) * 180 / (float) Math.PI; } } }, accelerometer, gravitySensor, SensorManager.SENSOR_DELAY_GAME); ``` 磁场感应器可以用来检测手机方向,可以通过以下代码获取手机方向角度: ``` SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(new SensorEventListener() { float[] accelerometerValues = new float[3]; float[] magneticValues = new float[3]; @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { accelerometerValues = event.values.clone(); } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { magneticValues = event.values.clone(); } float[] R = new float[9]; float[] values = new float[3]; SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues); SensorManager.getOrientation(R, values); float azimuth = (float) Math.toDegrees(values[0]); float pitch = (float) Math.toDegrees(values[1]); float roll = (float) Math.toDegrees(values[2]); } }, magneticSensor, accelerometer, SensorManager.SENSOR_DELAY_GAME); ``` 通过以上代码,你可以获取手机的倾斜角度方向角度等信息,从而获得手机的运动方向角度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值