Android開發學習之基于Cnavas和方向傳感器實現指南針效果

jopen 10年前發布 | 27K 次閱讀 Android Android開發 移動開發

     今天我們在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);  
        }  

    }  </pre><a href="/misc/goto?guid=4959552042866881978" target="_blank" title="派生到我的代碼片" style="text-indent:0;"></a></div>

</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();  
            }  
        }  

    };  </pre><a href="/misc/goto?guid=4959552042866881978" target="_blank" title="派生到我的代碼片" style="text-indent:0;"></a></div>

</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);  
        }  

    }  
}  </pre><a href="/misc/goto?guid=4959552042866881978" target="_blank" title="派生到我的代碼片" style="text-indent:0;"></a></div>

</div> </div> 來自:http://blog.csdn.net/qinyuanpei/article/details/20762239

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!