Android开发学习之基于Cnavas跟方向传感器实现指南针效果

Android开发学习之基于Cnavas和方向传感器实现指南针效果

         今天我们在Android开发学习之Android2D绘图基础这篇文章的基础上来实现一个指南针应用,原理是根据方向传感器来旋转Cnavas。首先我们编写一个Campass类,该类继承自View,我们将在此类中完成大部分的绘制工作,代码如下:

private class CampassView extends View
	{
		//定义一个Path对象以用于绘图
		private Path mPath=new Path();
		
		public CampassView(Context context) {
			super(context);
			//使用Path绘制指南针
			mPath.moveTo(0, -50);
			mPath.lineTo(-20, 60);
			mPath.lineTo(0, 50);
			mPath.lineTo(20, 60);
			mPath.close();
		}
		
		@SuppressLint("DrawAllocation")
		@Override
		protected void onDraw(Canvas mCanvas) 
		{
			Paint mPaint=new Paint();
			//设置画笔消除锯齿 
			mPaint.setAntiAlias(true);
			//设置笔刷颜色为黑色
			mPaint.setColor(Color.BLACK);
			//设置画布颜色为白色
			mCanvas.drawColor(Color.WHITE);
			//得到画布的宽度和高度
			int w=mCanvas.getWidth();
			int h=mCanvas.getHeight();
			//将坐标系平移到画布*
			int cx=w/2;
			int cy=h/2;
			mCanvas.translate(cx, cy);
			if(mValues!=null)
			{
				mCanvas.rotate(-mValues[0]);
			}
			//绘制Path
			mCanvas.drawPath(mPath, mPaint);
		}
		
	}
 

        接下来我们来看方向传感器这部分的代码“

//传感器
	private Sensor sensor;
	//传感器管理器
	private SensorManager sensorManager;
	//电子罗盘
	private CampassView mCampassView;
	//方向向量数组
	private float[] mValues;
	//传感器事件回调接口
	private SensorEventListener mListener=new SensorEventListener()
	{
		
		@Override
		public void onAccuracyChanged(Sensor mSensor, int mAccurate) {
			
		}
		
		@Override
		public void onSensorChanged(SensorEvent mEvent) {
			//当传感器发生变化时,更新界面
			mValues=mEvent.values;
			if(mCampassView!=null)
			{
				mCampassView.invalidate();
			}
		}
		
	};

         这里,我们根据SensorEventListener接口实现对传感器的监听,当传感器发生变化的时候,我们获取传感器的方向数组mValues,并通过mValues中的第一个参数来实现画布旋转,进而刷新界面,这样我们就做好了一个简单的指南针应用

         最后给出全部代码:

package com.android.campass;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.view.View;

public class MainActivity extends Activity {
	

	//传感器
	private Sensor sensor;
	//传感器管理器
	private SensorManager sensorManager;
	//电子罗盘
	private CampassView mCampassView;
	//方向向量数组
	private float[] mValues;
	//传感器事件回调接口
	private SensorEventListener mListener=new SensorEventListener()
	{
		
		@Override
		public void onAccuracyChanged(Sensor mSensor, int mAccurate) {
			
		}
		
		@Override
		public void onSensorChanged(SensorEvent mEvent) {
			//当传感器发生变化时,更新界面
			mValues=mEvent.values;
			if(mCampassView!=null)
			{
				mCampassView.invalidate();
			}
		}
		
	};
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//获取传感器管理器
		sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
		//获取方向传感器
		sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
		//设置界面为电子罗盘
		mCampassView=new CampassView(this);
		setContentView(mCampassView);
	}

	@Override
	protected void onResume() {
		super.onResume();
		//注册传感器
		sensorManager.registerListener(mListener,sensor,SensorManager.SENSOR_DELAY_GAME);
	}

	@Override
	protected void onStop() 
	{
		super.onStop();
		//取消传感器
		sensorManager.unregisterListener(mListener);
	}

	
	private class CampassView extends View
	{
		//定义一个Path对象以用于绘图
		private Path mPath=new Path();
		
		public CampassView(Context context) {
			super(context);
			//使用Path绘制指南针
			mPath.moveTo(0, -50);
			mPath.lineTo(-20, 60);
			mPath.lineTo(0, 50);
			mPath.lineTo(20, 60);
			mPath.close();
		}
		
		@SuppressLint("DrawAllocation")
		@Override
		protected void onDraw(Canvas mCanvas) 
		{
			Paint mPaint=new Paint();
			//设置画笔消除锯齿 
			mPaint.setAntiAlias(true);
			//设置笔刷颜色为黑色
			mPaint.setColor(Color.BLACK);
			//设置画布颜色为白色
			mCanvas.drawColor(Color.WHITE);
			//得到画布的宽度和高度
			int w=mCanvas.getWidth();
			int h=mCanvas.getHeight();
			//将坐标系平移到画布*
			int cx=w/2;
			int cy=h/2;
			mCanvas.translate(cx, cy);
			if(mValues!=null)
			{
				mCanvas.rotate(-mValues[0]);
			}
			//绘制Path
			mCanvas.drawPath(mPath, mPaint);
		}
		
	}
}
         谢谢大家,就是这样了