最近學習了下感應器的操作,但很多書籍都直接講怎麼取值,沒有講清楚怎麼分辨不同類型感應器XYZ座標方向的問題,小馬這篇文章主要來說下方向的分辨及小工具實現類比真機感應器的訪問,因為小馬在方向感上很YUN....所以寫這篇文章來理下自己的腦瓜..希望對大家有協助:先貼下,後面再細講:
一:小工具貼圖,請詳細看下改變方向時三個值的變化
二:手機中裝入小工具APK貼圖效果:
三:監聽連接埠:
四:設定手機串連小工具貼圖:
五:類比手機擺動
在此,小馬講下常用的感應器的XYZ軸,一定要搞清楚方向,不然暈....
1》:手機螢幕XY方向,因為手機螢幕沒Z軸,隨便哪只手拿著手機,那麼左上方 為原點,X正方向向右,Y軸正方向向下....
2》:加速感應器方向,隨便哪只手正常拿著手機時,右下角為原點,X軸沿螢幕 向右,Y軸沿螢幕向上,Z軸垂直螢幕向上....
3》:姿態感應器,上面動態圖中的Yaw...Pitch...Roll三個軸就搞笑了,具體是 這樣的:
3.1:Yaw軸,方向不變,一起是重力加速度g的反方向,也就是一起垂直向上
3.2:Pitch軸,並不是固定不變,隨著Yaw的變化而變化,只有與Yaw軸成90度 角永遠不變,無論手機怎麼轉,它是一起與Yaw垂直不變的哦....
3.3:Roll軸沿手機螢幕向上,無論手機怎樣放置,Roll的方向都是沿螢幕向 上,可以說與手機綁定死了...
效果看完了,現在來看下具體的實現過程吧,吼吼,說難不難,說簡單也不簡單,使用的模擬器小工具小馬因為過大,小馬上傳不上來,我會給出串連,需要的朋友可以自行訪問下載下的,寫下使用步驟(流水帳了....),看不懂使用步驟的可以在下載小工具的連結中找更為詳細的使用方法哦,自己試著找下吧...
1.將下載的小工具libs包匯入到我們工程中
2.再找到下載的小工具中Jar包,可直接點擊運行,用來監聽連接埠,實現類比
3.再將小工具中的APK檔案裝到模擬器中,運行這個APK程式,設定下IP 連接埠
4.點擊Conn...串連到小工具,連接埠要與模擬器配置的連接埠一致,否則無效
5.大體就是這樣了,下面小馬再貼下代碼,不懂的朋友不用擔心,看完就明白了
主控制碼:
1. package com.xiaoma.sensor.demo;
2.
3. import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;
4.
5. import android.app.Activity;
6. import android.hardware.Sensor;
7. import android.hardware.SensorEvent;
8. import android.hardware.SensorEventListener;
9. import android.hardware.SensorListener;
10. import android.hardware.SensorManager;
11. import android.os.Bundle;
12. import android.util.Log;
13. import android.widget.TextView;
14.
15. /**
16. * @Title: SensorDemoActivity.java
17. * @Package com.xiaoma.sensor.demo
18. * @Description: 感應器測試
19. * @author XiaoMa
20. */
21. public class SensorDemoActivity extends Activity implements
22. org.openintents.sensorsimulator.hardware.SensorEventListener {
23.
24. private TextView tView;
25. private TextView tView2;
26. private TextView tView3;
27. // private SensorManager manager = null;
28. private SensorManagerSimulator imulatorManager = null;
29.
30. /** Called when the activity is first created. */
31. @Override
32. public void onCreate(Bundle savedInstanceState) {
33. super.onCreate(savedInstanceState);
34. setContentView(R.layout.main);
35. init();
36. }
37.
38. /**
39. * 初始化方法實現
40. */
41. private void init() {
42.
43. tView = (TextView) findViewById(R.id.textview);
44. tView2 = (TextView) findViewById(R.id.textview2);
45. tView3 = (TextView) findViewById(R.id.textview3);
46.
47. /**
48. * 一般取感應器服務的方式只有一種,今天小馬來說下藉助Google提供的工具來實現
49. * 在模擬器上類比真機的感應器測試,很爽的哦....不用真機也可以測效果,在此先
50. * 注釋下,下面的方式一是用正常的方式取感應器服務,方式二是用工具來實現類比真機
51. * 效果,但方式一無法在模擬器上測試,所以小馬就注釋掉,用方式二來進行講解
52. */
53.
54. //下面這行注釋是取得系統級感應器服務 方式一:
55. // manager= (SensorManager)getSystemService(SENSOR_SERVICE);
56.
57. //方式二:取得模擬器類比的感應器服務
58. imulatorManager = SensorManagerSimulator.getSystemService(this,
59. SENSOR_SERVICE);
60. //串連類比感應器的工具
61. imulatorManager.connectSimulator();
62.
63. /**
64. * 此處是小馬犯的錯,就是在注釋感應器監聽的時候直接在初始化方法裡面注釋,但官方
65. * 的指示是在onResume方法裡面注釋,固此小馬寫在這個地方,供大家參考,下面注釋
66. * 內容大家不要在這個地方註冊,有關感應器的註冊都在onResume方法裡註冊,吼吼,
67. * 下面是方式一註冊:
68. */
69. // manager.registerListener(this,
70. // manager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
71. // SensorManager.SENSOR_DELAY_GAME);
72. // manager.registerListener(this,
73. // manager.getDefaultSensor(Sensor.TYPE_GRAVITY),
74. // SensorManager.SENSOR_DELAY_GAME);
75. // Sensor sensor3 =
76. // manager.getDefaultSensor(sensor.TYPE_ACCELEROMETER);//加速度
77. }
78.
79. //onCreate>>onStart>>onResume...簡單的複習下生命週期
80. @Override
81. protected void onResume() {
82.
83.
84. /*方式一註冊:
85. * imulatorManager.registerListener(this,
86. * imulatorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
87. * SensorManager.SENSOR_DELAY_GAME);
88. * imulatorManager.registerListener(this,
89. * imulatorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
90. * SensorManager.SENSOR_DELAY_GAME);
91. * imulatorManager.registerListener(this,
92. * imulatorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
93. * SensorManager.SENSOR_DELAY_GAME);
94. */
95.
96. //方式二註冊
97. imulatorManager.registerListener(this,
98. imulatorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
99. SensorManager.SENSOR_DELAY_GAME);
100. imulatorManager.registerListener(this,
101. imulatorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE),
102. SensorManager.SENSOR_DELAY_GAME);
103. imulatorManager.registerListener(this,
104. imulatorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
105. SensorManager.SENSOR_DELAY_GAME);
106. super.onResume();
107. }
108.
109. /**
110. * 下面這個監聽本來是用來監聽感應器的,後來版本升級用SensorEventListener來代碼下面這
111. * 段代碼了,小馬寫在這個地方只為與新版對比下,很有特點,希望大家仔細觀察下....
112. */
113. /*
114. * private SensorListener listener = new SensorListener() {
115. *
116. * @Override public void onSensorChanged(int sensor, float[] values) { }
117. *
118. * @Override public void onAccuracyChanged(int sensor, int accuracy) { } };
119. */
120.
121.
122.
123.
124. /**
125. * 因為當前類實現Google提供工具中的介面類,下面這兩個方法必須實現
126. * 細心的朋友可以發現與上面的不同之處了吧
127. */
128. @Override
129. public void onAccuracyChanged(
130. org.openintents.sensorsimulator.hardware.Sensor arg0, int arg1) {
131. }
132.
133. @Override
134. public void onSensorChanged(
135. org.openintents.sensorsimulator.hardware.SensorEvent event) {
136. Log.i("XiaoMa", "調用onSensorChanged()方法了");
137. float x = event.values[SensorManager.DATA_X];// 或直接寫:values[0]
138. float y = event.values[SensorManager.DATA_Y];// 或直接寫:values[1]
139. float z = event.values[SensorManager.DATA_Z];// 或直接寫:values[2]
140.
141. if (SensorManager.SENSOR_ORIENTATION == event.sensor.TYPE_ORIENTATION) {
142. tView.setText("方向感應器:" + "\n" + "X:" + x + "\n" + "Y:" + y + "\n"
143. + "Z:" + z + "\n");
144. }
145. if (SensorManager.SENSOR_ACCELEROMETER == event.sensor.TYPE_ACCELEROMETER) {
146. tView3.setText("加速感應器:" + "\n" + "X:" + x + "\n" + "Y:" + y + "\n"
147. + "Z:" + z + "\n");
148. }
149.
150. /**
151. * 本來這個地方要寫的是重力感應器,但在這個外掛程式下沒有重力感應器,臨時改成溫度了,類同...
152. * 工具當中沒有不代表裝置中沒有,這篇文章目的是為了藉助工具實現在類比上類比真機感應器測試
153. */
154. if (SensorManager.SENSOR_TEMPERATURE == event.sensor.TYPE_TEMPERATURE) {
155. tView3.setText("溫度感應器:" + "\n" + "X:" + x + "\n" + "Y:" + y + "\n"
156. + "Z:" + z + "\n");
157. }
158.
159. }
160.
161. /*
162. * 方式:下面也是同樣的事件函數,寫在這個地方也為與其它版本對比,省了翻來翻去
163. * @Override public void onSensorChanged(SensorEvent event) {
164. * float x = event.values[SensorManager.DATA_X];//或直接寫:values[0]
165. * float y = event.values[SensorManager.DATA_Y];//或直接寫:values[1]
166. * float z = event.values[SensorManager.DATA_Z];//或直接寫:values[2]
167. *
168. * switch (event.sensor.getType()) { case Sensor.TYPE_ORIENTATION:
169. * tView.setText("方向感應器:"+"\n"+"X:"+x+"\n"+"Y:"+y+"\n"+"Z:"+z+"\n"); break;
170. * case Sensor.TYPE_GRAVITY:
171. * tView2.setText("重力感應器:"+"\n"+"X:"+x+"\n"+"Y:"+y+"\n"+"Z:"+z+"\n"); break;
172. * case Sensor.TYPE_ACCELEROMETER:
173. * tView3.setText("加速感應器:"+"\n"+"X:"+x+"\n"+"Y:"+y+"\n"+"Z:"+z+"\n");
174. *
175. * default: break; }
176. *
177. * }
178. */
179.
180. /*
181. * @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }
182. */
183.
184. /**
185. * 朋友也注意下,最後這步也很重要,因為一個裝置上可以有多個感應器,況且感應器很耗電量,
186. * 所以用完之後一定養成好習慣,及時關閉感應器,留電量給使用者用在其它地方
187. */
188. @Override
189. protected void onStop() {
190. // manager.unregisterListener(this);
191. imulatorManager.unregisterListener(this);
192. super.onStop();
193. }
194.
195.
196. /**
197. * 最後小馬貼下感應器學習的很不錯的Google網址,有興趣的朋友可以自行瀏覽下
198. * http://code.google.com/p/openintents/wiki/SensorSimulator
199. * 或:
200. * http://developer.android.com/guide/topics/sensors/index.html
201. */
202. }
全域設定檔:
1. <?xml version="1.0" encoding="utf-8"?>
2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3. package="com.xiaoma.sensor.demo"
4. android:versionCode="1"
5. android:versionName="1.0" >
6.
7. <uses-sdk android:minSdkVersion="7" />
8. <!-- 因為今天講的是用工具來類比真實的感應器資料,因工具中用到了網路連接,因此需要開啟以下許可權 -->
9. <uses-permission android:name="android.permission.INTERNET"/>
10. <application
11. android:icon="@drawable/ic_launcher"
12. android:label="@string/app_name" >
13. <activity
14. android:name=".SensorDemoActivity"
15. android:label="@string/app_name" >
16. <intent-filter>
17. <action android:name="android.intent.action.MAIN" />
18.
19. <category android:name="android.intent.category.LAUNCHER" />
20. </intent-filter>
21. </activity>
22. </application>
23. </manifest>
j最後,老規矩的,小DEMO源碼放附件裡,有需要的朋友可以下載下,學習交流,再講下,在類比取值的實現有可以模擬器中取不到值哦,其實還是取不到,而是模擬器不給力,再啟下就可以了,吼吼....小工具的是:
http://code.google.com/p/androidjustice/downloads/detail?name=sensorsimulator-1.0.0-beta1.zip&can=2&q=
因為小馬也在學習階段,如有發現有什麼不對的地方,可直接批評指出,小馬跟大家一起交流進步,謝謝提出問題的朋友....謝謝
摘自 酷_莫名簡單