Android應用開發提高篇(3)-----傳感器(Sensor)編程


一、概述

     Android支持的傳感器種類越來越多了,這確實是一件可喜的事情,兩年前在單片機上玩過加速度傳感器模塊,當時做的是一個摔倒檢測的項目,利用相關的算法對三軸數據進行采集、處理、判斷來實現檢測,既然是摔倒檢測,那肯定是一個便攜式設備吧,沒錯,當時做出來的設備是小到可以放進口袋里的。慶幸的是,今天這些東西完全可以在手機上完成了,而且不用涉及到硬件設計的問題,不過今天不是講如何去移植那個項目,而是講講Android上的傳感器編程。Android,再一次讓我看到你的強大!再一次堅定了我學習你的信心!


二、要求

     了解、熟悉傳感器的編程方法。


三、實現

     新建工程MySensor,修改/res/layout/main.xml文件,在里面添加一個SurfaceView,完整的main.xml文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <SurfaceView
8 android:id="@+id/surfaceview"
9 android:layout_width="fill_parent"
10 android:layout_height="180dip"
11 />
12
13
14 </LinearLayout>

接着,修改MySensorActivity.java文件,代碼中有詳細注釋,完整的MySensorActivity.java文件如下:

 

  1 package com.nan.sensor;
2
3 import android.app.Activity;
4 import android.graphics.Canvas;
5 import android.graphics.Color;
6 import android.graphics.Paint;
7 import android.graphics.Rect;
8 import android.hardware.Sensor;
9 import android.hardware.SensorEvent;
10 import android.hardware.SensorEventListener;
11 import android.hardware.SensorManager;
12 import android.os.Bundle;
13 import android.view.SurfaceHolder;
14 import android.view.SurfaceView;
15
16 public class MySensorActivity extends Activity
17 {
18 private float acceValusX = 0f;
19 private float acceValusY = 0f;
20 private float acceValusZ = 0f;
21 private int x = 0;
22
23 private SurfaceView mSurfaceView = null;
24 private SurfaceHolder mSurfaceHolder = null;
25 private Paint mPaint = null;
26
27 private SensorManager mSensorManager;
28 private Sensor mAccelerometer;
29 private OnSensorEventListener mOnSensorEventListener = new OnSensorEventListener();
30
31 /** Called when the activity is first created. */
32 @Override
33 public void onCreate(Bundle savedInstanceState)
34
35 {
36 super.onCreate(savedInstanceState);
37 setContentView(R.layout.main);
38
39 mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);
40 mSurfaceHolder = mSurfaceView.getHolder();
41 mSurfaceHolder.addCallback(new MyHolder());
42
43 mPaint = new Paint();
44 //畫筆的粗細
45 mPaint.setStrokeWidth(1.0f);
46 //從系統服務中獲得傳感器管服務
47 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
48 mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
49 //注冊傳感器監聽
50 mSensorManager.registerListener(mOnSensorEventListener, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);
51 }
52
53
54 private class OnSensorEventListener implements SensorEventListener
55 {
56
57 @Override
58 public void onAccuracyChanged(Sensor sensor, int accuracy)
59 {
60 // TODO Auto-generated method stub
61
62 }
63
64 @Override
65 public void onSensorChanged(SensorEvent event)
66 {
67 // TODO Auto-generated method stub
68
69 //獲得x軸的值
70 acceValusX = event.values[0];
71 //獲得y軸的值
72 acceValusY = event.values[1];
73 //獲得z軸的值
74 acceValusZ = event.values[2];
75
76 //鎖定整個SurfaceView
77 Canvas mCanvas = mSurfaceHolder.lockCanvas();
78 try
79 {
80 if(mCanvas!=null)
81 {
82 //畫筆的顏色(紅)
83 mPaint.setColor(Color.RED);
84 //畫X軸的點
85 mCanvas.drawPoint(x, (int)(30 + acceValusX), mPaint);
86 //畫筆的顏色(綠)
87 mPaint.setColor(Color.GREEN);
88 //畫Y軸的點
89 mCanvas.drawPoint(x, (int)(60 + acceValusY), mPaint);
90 //畫筆的顏色(藍)
91 mPaint.setColor(Color.BLUE);
92 //畫Z軸的點
93 mCanvas.drawPoint(x, (int)(90 + acceValusZ), mPaint);
94 //橫坐標+1
95 x++;
96 //如果已經畫到了屏幕的最右邊
97 if(x > getWindowManager().getDefaultDisplay().getWidth())
98 {
99 x = 0;
100 //清屏
101 mCanvas.drawColor(Color.BLACK);
102 }
103 //繪制完成,提交修改
104 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
105 }
106 }
107 catch(Exception e)
108 {
109 e.printStackTrace();
110 }
111 finally
112 {
113 if(mCanvas!=null)
114 {
115 //重新鎖一次
116 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
117 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
118 }
119 }
120
121 }
122
123 }
124
125
126 //定義一個類,實現Callback接口
127 public class MyHolder implements SurfaceHolder.Callback
128 {
129
130 public void surfaceChanged(SurfaceHolder holder, int format, int width,
131 int height)
132 {
133 // TODO Auto-generated method stub
134 //add your code
135 }
136
137 public void surfaceCreated(SurfaceHolder holder)
138 {
139 // TODO Auto-generated method stub
140 //add your code
141 }
142
143 public void surfaceDestroyed(SurfaceHolder holder)
144 {
145 // TODO Auto-generated method stub
146 //add your code
147 }
148
149 }
150
151 @Override
152 public void onDestroy()
153 {
154 super.onDestroy();
155 //注銷傳感器監聽
156 mSensorManager.unregisterListener(mOnSensorEventListener, mAccelerometer);
157 }
158
159 }

好了,在真機上運行它,效果如下:

 

晃動手機幾下,效果如下:

 

完成。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM