当前位置: 代码迷 >> Android >> Android开发学习之基于Cnavas跟方向传感器实现指南针效果
  详细解决方案

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

热度:47   发布时间:2016-04-28 06:42:54.0
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);		}			}}
         谢谢大家,就是这样了

  相关解决方案