好久沒有寫跟Android相關的東西
心血來潮來寫一下
在ANDROID 1.5之後,settings的選項中多了一個Orientation
這個選項就是讓G-sensor有所作用的一個功能
它能隨著user的螢幕目前的導向,做出想對應的rotation
當然我們可以從他的code中更仔細的探討(SoundAndDisplaySettings.java -> PhoneWindowManager.java -> WindowOrientationListener.java)
當然這邊我們就不去多說他囉!想知道請自己看過一次code
當然還要對三軸空間有一定的概念
那就讓我們trace一下個人認為比較重要的段落(用G-sensor來rotate screen的演算法)
WindowOrientationListener.java -> onSensorChanged()
(1) gravity => x+y+z軸的G力,換句話說就是手機目前所承受的G力
(2) zyangle => 當z與y軸所計算出的角度小於65度或是大於-60度,就是手機並非處於平躺的狀態,就去trigger手機的螢幕旋轉的conditions
(3) angle => X與Y軸的相對角度,照道理說應該是90度,所以在orientation會修正回來正確螢幕的角度
(4) orientation => orientation就是修正過後的角度,也就是螢幕目前的角度
(5) threshold => 顧名思義,他就去trigger旋轉螢幕的條件
簡單的來說,這個portrait mode to landscape mode或是landscape to portrait,都是由這些步驟所完成的,不過目前的code來看應該只有支援轉0度(不要轉)與轉90度,其他兩種似乎不支援,若是各位朋友想要自己porting改code的話,可以建議從這一個java code下手,只是建議而已!good luck~
步驟:
Step1. 判斷目前的手機是否平躺,平躺的話就不理會其他值
Step2. 若手機沒有平躺,先算出手機目前轉向的角度
Step3. 看手機目前的角度是否符和trigger的條件
Step4. 若是符合,則適當旋轉手機螢幕來符合使用者的需求
Step5. 做完上述步驟,又會回到Step1

神奇!
只是物理原理罷了!
書山有路勤為徑,學海無涯苦作舟
你好, 我目前嘗試在Android上寫一個Sensor Driver,但是如果根據Sensor.h的定義,我所傳送的XYZ參數值經過這裡的演算法後,並不能轉向正確的角度,請問可能是我XYZ值送的值不對,或是這邊的演算法是有需要修改? Sensor.h的定義如下: * * x<0 x>0 * ^ * | * +-----------+--> y>0 * | | * | | * | | * | | / z<0 * | | / * | | / * O-----------+/ * |[] [ ] []/ * +----------/+ y<0 * / * / * |/ z>0 (toward the sky) * * O: Origin (x=0,y=0,z=0) * * * Orientation * ----------- * * All values are angles in degrees. * * azimuth: angle between the magnetic north direction and the Y axis, around * the Z axis (0<=azimuth<360). * 0=North, 90=East, 180=South, 270=West * * pitch: Rotation around X axis (-180<=pitch<=180), with positive values when * the z-axis moves toward the y-axis. * * roll: Rotation around Y axis (-90<=roll<=90), with positive values when * the z-axis moves AWAY from the x-axis. * 以下是我的XYZ定義: X=azimuth, Y=pitch, Z=roll 舉例: 當我手機從直立(面對手機)轉向水平(手機top朝左或朝右),經過演算法後,並不會正確回傳ROTATION_90。 直立: (X=0, Y=-90, Z=0) 水平朝左: (X=270, Y=0, Z=-90) 水平朝右: (X=90, Y=0, Z=90)
你可以試著先把你從sensor的值印出來,來後把X Y Z帶進去公式算算看! 驗證你的數值是不是正確的!這個演算法算是標準的Rotation方式,試試看吧!
Sorry!圖好像看不清楚了,這是sensor.h的PATH,cupcake/hardware/libhardware/include/hardware/sensor.h。 如果你可以講解一下這邊的數學公式,也很感謝,謝謝!
It's ok. Thanks for your suggestion. 原來是我搞錯XYZ的定義,在這裡它應該是指3D座標上的向量,而不是角度。 以下是我列出來的值,供大家參考。 X Y Z zyAngle angle Oritntation Normalize delta 0度 0 3 0 0 90 0 0 -20 90度 3 0 0 0 180 -90 270 -20 180度 0 -3 0 0 -90 180 180 -20 270度 -3 0 0 0 0 90 90 -20