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

jopen 10年前

     今天我们在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);                }                            }  
</div> </div>  

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

    //传感器            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();                    }                }                            };  
</div> </div>
         这里,我们根据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);                }                            }        }  
</div> </div> 来自:http://blog.csdn.net/qinyuanpei/article/details/20762239