Android指南针程序的实现

在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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值