Android指南针app的实现原理总结
来源:互联网 发布:三国志11 mac 10.12 编辑:程序博客网 时间:2024/05/13 14:25
要想实现指南针功能,其实主要就是获取手机的方位,通过对比前一刻方位和现在手机方位算出手机旋转的角度,然后根据手机实际旋转的角度去旋转指南针的imageview。关键在于如何获取手机实际方位。
那么如何获取到这个方位呢?
那么,android中不是有方向传感器吗?其实android的方向传感器不是物理实际存在的,它只是逻辑上的,什么意思,就是它是通过磁力计和加速度计抽象出来的。因此,这个方位的获得其实是通过这两个传感器的数据通过一定的算法得到的。而这个算法则封装在了api中,我们只需直接使用即可。
一般情况下,在android系统中获取手机的方位信息azimuth似乎是很简单的事情,在api中有TYPE_ORIENTATION常量,可以像得到加速度传感器那样得到方向传感器sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);然而我们这样做的话在最新版的SDK中就会看到这么一句话:“TYPE_ORIENTATION
那么我们来看一下这个getOriention的用法。
先看看器定义:
public static float[] getOrientation (float[] R,float[] values)
第一个参数是R[]是一个旋转矩阵,用来保存磁场和加速度的数据,可以理解为这个函数的传入值,通过它这个函数给你求出方位角。
第二个参数就是这个函数的输出了,他有函数自动为我们填充,这就是我们想要的。
values[0]
values[1]
values[2]
现在问题是这个R[]怎么获取,其实他是通过函数getRotationMatrix得到的。
看看getRotationMatrix的定义:
public static boolean getRotationMatrix (float[] R, float[] I,float[] gravity, float[] geomagnetic)
解释以下参数,第一个就是我们需要填充的R数组,大小是9
实例代码:
public
class
OrientationActivity
extends
Activity{
TextViewtextview=
null
;
private
SensorManager sm=
null
;
private
Sensor aSensor=
null
;
private
Sensor mSensor=
null
;
float
[]accelerometerValues=
new
float
[
3
];
float
[]magneticFieldValues=
new
float
[
3
];
float
[]values=
new
float
[
3
];
float
[]R=
new
float
[
9
];
@Override
public
void
onCreate(Bundle savedInstanceState){
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
textview=(TextView)findViewById(R.id.view_main);
sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
aSensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensor=sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sm.registerListener(myListener,aSensor,SensorManager.SENSOR_DELAY_GAME);
sm.registerListener(myListener,mSensor,SensorManager.SENSOR_DELAY_GAME);
}
@Override
//注意activity暂停的时候释放
protected
void
onPause(){
//TODO Auto-generated methodstub
super
.onPause();
sm.unregisterListener(myListener);
}
final
SensorEventListenermyListener=
new
SensorEventListener(){
@Override
public
void
onAccuracyChanged(Sensor sensor,
int
accuracy){
//TODO Auto-generated methodstub
}
@Override
public
void
onSensorChanged(SensorEvent event){
//TODO Auto-generated methodstub
if
(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
accelerometerValues=event.values;
}
if
(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
magneticFieldValues=event.values;
}
//调用getRotaionMatrix获得变换矩阵R[]
SensorManager.getRotationMatrix(R,
null
,accelerometerValues,magneticFieldValues);
SensorManager.getOrientation(R,values);
//经过SensorManager.getOrientation(R,values);得到的values值为弧度
//转换为角度
values[
0
]=(
float
)Math.toDegrees(values[
0
]);
textview.setText(
"x="
+values[
0
]);
}};
- Android指南针app的实现原理总结
- Android指南针app的实现原理总结
- Android指南针程序的实现
- Android传感器介绍及指南针的实现
- Android传感器介绍及指南针的实现
- Android实现指南针功能
- Android 实现指南针效果
- 指南针的实现
- 简易指南针的实现
- Android 方向感应器实现指南针
- android 传感器使用 Compass指南针的实现功能
- 【Android开发小记--8】传感器 以及 指南针的实现
- android基础--采用方向传感器实现指南针
- Android 利用方向传感器实现 指南针
- Android Canvas 实现指南针(Compass)
- Android传感器指南针(真机实现)
- Android下的APP日志采集的原理及其实现
- android 指南针
- Android 系统默认参数的修改(一)
- HTML-表单标签
- Android 系统默认参数的修改(二)
- Android Camera sensor…
- Android操作系统11种传感器介绍
- Android指南针app的实现原理总结
- Ubuntu 12.04 打开开机…
- React组件化
- r debug方法
- 联芯L1860C平台相关Android源码调…
- Andrpid评测分析-安兔兔V6.0技术解…
- zip error: Invalid&nbs…
- 阿里YunOS和Android的关系(转载)
- Android 不支持Linux应用SYSV…