Android开发学习之基于Cnavas和方向传感器实现指南针效果
jopen
11年前
今天我们在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); } } }