本文主要是介绍Android中方向传感器的用法,制作简易指南针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
项目效果
项目结构
activity_main.xm
核l心代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/compass_img"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_centerInParent="true"
android:src="@drawable/compass" />
<ImageView
android:id="@+id/arrow_img"
android:layout_width="60dp"
android:layout_height="110dp"
android:layout_centerInParent="true"
android:src="@drawable/arrow" />
</RelativeLayout>
MainActivity
public class MainActivity extends Activity {
private SensorManager sensorManager;
private ImageView compassImg;//指南针的表盘
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化赋值
compassImg=(ImageView) findViewById(R.id.compass_img);
sensorManager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
//地磁传感器实例
Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
//加速度传感器实例
Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(listener, magneticSensor, sensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(listener, accelerometerSensor, sensorManager.SENSOR_DELAY_GAME);
}
private SensorEventListener listener=new SensorEventListener() {
float[] accelerometerValues=new float[3];
float[] magneticValues = new float[3];
private float lastRotateDegree;
@Override
public void onSensorChanged(SensorEvent event) {
//判断当前是加速度传感器还是地磁传感器
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
//注意赋值时要调用clone方法
//SensorEvent的values数组,就可以得到传感器输出的所有值了。
accelerometerValues=event.values.clone();
}else if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
//注意赋值时要调用clone方法
magneticValues=event.values.clone();
}
float[] R = new float[9];
float[] values = new float[3];
//将两个值传入到getRotationMatrix的方法中就可以得到一个包含旋转矩阵的R数组。
//其中R是一个长度为9的float数组,getRotationMatrix方法计算出的旋转数据就会赋值到这个数组当中
//第二个参数是一个用于将地磁向量转换成重力坐标的旋转矩阵,通常定位null值即可。
//第三,第四个参数分别就是加速度传感器和地磁传感器输出的values值
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
/*得到R数组之后,接着就可以调用getOrientation的方法来计算手机的旋转数据了。
* values[0]记录着手机围绕z轴的旋转弧度
* values[1]记录着手机围绕x轴的旋转弧度
* values[2]记录着手机围绕x轴的旋转弧度
* 计算出的数据都是以弧度为单位的,因此转化成角度调用Math.toDegrees(values[0])
* values[0];的取值范围是-180度到+180度,其中+-180度表示正南方向,0度表示正北方向,
* -90度表示正西方向,90度表示正东方向
* */
sensorManager.getOrientation(R, values);
Log.e("1", "value[0] is"+Math.toDegrees(values[0]));
//将计算出来的旋转角取反,用于旋转指南针背景图
float rotateDegree=-(float) Math.toDegrees(values[0]);
if (Math.abs(rotateDegree-lastRotateDegree)>1) {
/*
* 使用旋转动画技术
* 创建了一个RotateAnimation实例
* 并在构造方法中传入了6个参数
* 参数1表示旋转的启示角度
* 参数2表示旋转的终止角度
* 后四个参数用于指定旋转的中心点
* 这里我们把从传感器中获取到的旋转角取反,传递给RotateAnimation,并指定旋转
* 的中心点为指南针背景的中心,然后调用ImageView的startAnimation()的方法
* 来执行旋转动画
*/
RotateAnimation animation= new RotateAnimation(lastRotateDegree, rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animation.setFillAfter(true);
compassImg.startAnimation(animation);
lastRotateDegree=rotateDegree;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if (sensorManager!=null) {
sensorManager.unregisterListener(listener);
}
}
}//class
如果没有明白下载我的例子:
http://download.csdn.net/detail/zhaihaohao1/8406581
这篇关于Android中方向传感器的用法,制作简易指南针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!