文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei。
坐标修订
在小例子中,新旧两种方法并没有显示太大的差异。单如果我们切换到横屏,情况会如何?用户在看地图,如果我们切换到横屏,我们仍希望我们所看的方位是根据用户视图,给出正前方的方位,也就是原来手机X轴的方位,也即相应的方位角、roll和pitch能够适应到横屏情况。新方法是基于矩阵进行计算,矩阵可以提供坐标轴更换的计算,Android提供了相关的API。我们在小例子的基础上进行对横屏情况的修正。
public class VirtualJax extends Activity implements SensorEventListener{
private int mRotation;
private float[] outR = new float[9];
……
@Override
protected void onCreate(Bundle savedInstanceState) {
......
//【1】获得屏幕旋转的情况
WindowManager window = (WindowManager) this.getSystemService(WINDOW_SERVICE);
if(Build.VERSION.SDK_INT <8)
mRotation = window.getDefaultDisplay().getOrientation();
else
mRotation = window.getDefaultDisplay().getRotation();
}
@Override
public void onSensorChanged(SensorEvent event) {
......
if(SensorManager.getRotationMatrix(inR, inclineMatrix, accelValues, compassValues)){
//【2】坐标转换位API用于getRotationMatrix()和getOrientation()之间
if(isAllowRemap && mRotation == Surface.ROTATION_90){
//参数二表示设备X轴成为新坐标的Y轴,参数三表示设备Y轴成为新坐标-x轴(方向相反)
SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, outR);
SensorManager.getOrientation(outR, prefValues);
}else{
SensorManager.getOrientation(inR, prefValues);
}
......
}
}
地理北和地磁北
我们知道地理被极点和磁场的北极点很接近,但是不是重叠,两者之间的差异称为磁偏角。磁偏角和所在地点有关,即与经纬度相关,由于地磁位置不是一成不变的,所以和时间有关。如果磁场北极在地理北极的东边,磁偏角为正。下面是获得磁偏角的小例子,广州测得-2.662°。
public String getGeoNorthDeclination(){
String providerName = locManager.getBestProvider(new Criteria(), true);
Location loc = locManager.getLastKnownLocation(providerName);
//如果我们开启了gps,通常优选为gps,但是室内实际上很难马上获得gps,我们可以通过位置改变监听器的方式获取,为了方便,本例我们将改用network的基站三角定位的方式获得。
if(loc == null && locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
//在室内,由于不容易搜索到GPS,建议采用network方式。请注意,有些设备要在配置那里打开网络定位的选项,否则,network方式不能enabled,不能有效使用网络方式,getLastKnownLocation()仍会为null。正规的应用发现disabled,应该询问用户,并通过intent打开相关的配置页。
loc = locManager.getLastKnownLocation( LocationManager.NETWORK_PROVIDER );
}
if(loc == null)
return null;
GeomagneticField geo = new GeomagneticField((float)loc.getLatitude(),(float)loc.getLongitude(),
(float)loc.getAltitude(),System.currentTimeMillis());
float declination = geo.getDeclination();
return String.format("磁偏角:%7.3f", declination);
}
相关小例子代码:Pro Android学习:传感器小例子