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); } } </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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關經驗
相關資訊
相關文檔
目錄
sesese色