在Android中,指南针功能是依靠Android手机内置的方向传感器实现的。并且Android系统也已经封装好了针对这些传感器的所需操作,不用我们从底层去了解,因此编程变得相当简单。下面介绍如何实现指南针功能。
1、新建一个Activity,使其实现SensorEventListener接口。如下所示:
public class compassActivity extends Activity implements SensorEventListener {
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent arg0) {
}
}
可以看到,SensorEventListener接口提供两个重载方法,在这里我们只去复写onSensorChanged方法,当传感器的值发生变化时会触发这个方法。我们就在这个方法中改变指南针的方向。
2、在介绍业务代码之前,先来看一下Activity的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/orientationEditText"
android:layout_margin="10dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="orientation"
/>
<ImageView
android:id="@+id/compassImage"
android:layout_margin="10dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/orientationEditText"
android:scaleType="fitCenter"
android:src="@drawable/compass"
/>
</RelativeLayout>
其中EditText用来显示传感器角度变化值,ImageView则直观的显示这种变化。
2、业务实现:
package com.gan.compass;
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.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.EditText;
import android.widget.ImageView;
public class compassActivity extends Activity implements SensorEventListener {
private EditText orientationEditText;
private SensorManager SM;
private ImageView compassImage;
private float currentDegree = 0f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compass);
orientationEditText = (EditText) findViewById(R.id.orientationEditText);
compassImage = (ImageView) findViewById(R.id.compassImage);
}
@SuppressWarnings("deprecation")
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
SM = (SensorManager) getSystemService(SENSOR_SERVICE);
SM.registerListener(compassActivity.this,
SM.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onPause() {
SM.unregisterListener(compassActivity.this);
super.onPause();
}
@Override
protected void onStop() {
SM.unregisterListener(compassActivity.this);
super.onStop();
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent arg0) {
int sensorType = arg0.sensor.getType();
switch (sensorType) {
case Sensor.TYPE_ORIENTATION:
StringBuilder sb = new StringBuilder();
sb.append("绕Z轴转过的角度:");
sb.append(arg0.values[0]);
sb.append("\n绕X轴转过的角度:");
sb.append(arg0.values[1]);
sb.append("\n绕Y轴转过的角度:");
sb.append(arg0.values[2]);
orientationEditText.setText(sb.toString());
//获取手机绕Z轴转过的角度
float degree = arg0.values[0];
//创建旋转动画,反向转过degree度
RotateAnimation ra = new RotateAnimation(currentDegree,
-degree,
Animation.RELATIVE_TO_SELF,
0.5f,
Animation.RELATIVE_TO_SELF,
0.5f);
//设置动画的持续时间
ra.setDuration(200);
//运行动画
compassImage.startAnimation(ra);
currentDegree = -degree;
break;
}
}
}
以上代码显示,当传感器的值发生变化时,我们就让ImageView中的图片发生相应的转动,以指示方向。
效果如图所示:
如需要下载工程源文件,请点击:http://download.csdn.net/detail/ganzi1991/7125385