Android編程之重力感應(yīng)用法分析
本文實(shí)例講述了Android編程之重力感應(yīng)用法。分享給大家供大家參考,具體如下:
重力感應(yīng)主要是依靠手機(jī)的加速度傳感器(accelerometer)來(lái)實(shí)現(xiàn)
在Android的開(kāi)發(fā)中一共有八種傳感器但是不一定每一款真機(jī)都支持這些傳感器。因?yàn)楹芏喙δ苡脩?hù)根本不care的所以可能開(kāi)發(fā)商會(huì)把某些功能屏蔽掉。還是得根據(jù)真機(jī)的實(shí)際情況來(lái)做開(kāi)發(fā),下面主要討論加速度傳感器的具體實(shí)現(xiàn)方式,傳感器名稱(chēng)如下:
加速度傳感器(accelerometer)
陀螺儀傳感器(gyroscope)
環(huán)境光照傳感器(light)
磁力傳感器(magnetic field)
方向傳感器(orientation)
壓力傳感器(pressure)
距離傳感器(proximity)
溫度傳感器(temperature)
1.SensorMannager傳感器管理對(duì)象
手機(jī)中的所有傳感器都須要通過(guò)SensorMannager來(lái)訪(fǎng)問(wèn),調(diào)用getSystemService (SENSOR_SERVICE)方法就可以拿到當(dāng)前手機(jī)的傳感器管理對(duì)象。
2.實(shí)現(xiàn)SensorEventListener接口
我們需要實(shí)現(xiàn)SensorEventListener接口onSensorChanged(SensorEventevent)方法來(lái)捕獲手機(jī)傳感器的狀態(tài),拿到手機(jī) X軸Y軸Z軸三個(gè)方向的重力分量,有了這三個(gè)方向的數(shù)據(jù)重力感應(yīng)的原理我們就已經(jīng)學(xué)會(huì)了。
public void onSensorChanged(SensorEvent e) {
float x = e.values[SensorManager.DATA_X];
float y = e.values[SensorManager.DATA_Y];
float z = e.values[SensorManager.DATA_Z];
}
如上述代碼所示:float x y z 3個(gè)方向的取值范圍是在-10到10之間。下面解釋一下X軸 Y軸 Z軸 重力分量的含義(這里須要注意的是坐標(biāo)原點(diǎn):向天空為正數(shù),向地面為負(fù)數(shù),剛好與編程時(shí)坐標(biāo)是相反的):
(1)手機(jī)屏幕向左側(cè)方,X軸就朝向天空,垂直放置,這時(shí)候 Y 軸與Z軸沒(méi)有重力分量,因?yàn)閄軸朝向天空所以它的重力分量則最大。這時(shí)候X軸、Y軸、Z軸的重力分量的值分別為(10,0,0);
(2)手機(jī)屏幕向右側(cè)方,X軸就朝向地面,垂直放置,這時(shí)候 Y 軸與 Z軸沒(méi)有重力分量,因?yàn)閄軸朝向地面所以它的重力分量則最小。這時(shí)候X軸、Y軸、Z軸的重力分量的值分別為(-10,0,0);
(3)手機(jī)屏幕垂直豎立放置,Y軸就朝向天空,垂直放置,這時(shí)候X 軸與Z軸沒(méi)有重力分量,因?yàn)閅軸朝向天空所以它的重力分量則最大。這時(shí)候X軸、Y軸、Z軸的重力分量的值分別為(0,10,0);
(4)手機(jī)屏幕垂直豎立放置,Y軸就朝向地面,垂直放置,這時(shí)候X 軸與Z軸沒(méi)有重力分量,因?yàn)閅軸朝向地面所以它的重力分量則最小 。這時(shí)候X軸、Y軸、Z軸的重力分量的值分別為(0,-10,0);
(5)手機(jī)屏幕向上,Z軸就朝向天空,水平放置,這時(shí)候 X 軸與Y軸沒(méi)有重力分量,因?yàn)閆軸朝向天空所以它的重力分量則最大。這時(shí)候X軸、Y軸、Z軸的重力分量的值分別為(0,0,10);
(6)手機(jī)屏幕向上,Z軸就朝向地面,水平放置,這時(shí)候 X 軸與Y軸沒(méi)有重力分量,因?yàn)閆軸朝向地面所以它的重力分量則最小。這時(shí)候X軸、Y軸、Z軸的重力分量的值分別為(0,0,-10)。
3.注冊(cè)SensorEventListener
使用SensorMannager調(diào)用getDefaultSensor(Sensor.TYPE_ACCELEROMETER)方法拿到加速重力感應(yīng)的Sensor對(duì)象。因?yàn)槲矣懻摰氖侵亓铀俣葌鞲衅魉詤?shù)為Sensor.TYPE_ACCELEROMETER,如果需要拿到其它的傳感器需要傳入對(duì)應(yīng)的名稱(chēng)。使用SensorMannager調(diào)用registerListener()方法來(lái)注冊(cè),第三個(gè)參數(shù)是檢測(cè)的靈敏精確度,根據(jù)不同的需求來(lái)選擇精準(zhǔn)度,游戲開(kāi)發(fā)建議使用 SensorManagerSENSOR_DELAY_ GAME。
4 .重力感應(yīng)簡(jiǎn)單速度計(jì)算的方式
每次搖晃手機(jī)計(jì)算出 X軸 Y軸 Z軸的重力分量可以將它們記錄下來(lái) 然后每次搖晃的重力分量和之前的重力分量可以做一個(gè)對(duì)比,利用差值和時(shí)間就可以計(jì)算出他們的移動(dòng)速度。
重力感應(yīng)裝置包括感應(yīng)器、處理器和控制器三個(gè)部分。感應(yīng)器負(fù)責(zé)偵測(cè)存儲(chǔ)器的狀態(tài),計(jì)算存儲(chǔ)器的重力加速度值;處理器則對(duì)加速度值是否超出安全范圍進(jìn)行判斷;而控制器則負(fù)責(zé)控制將磁頭鎖定或者釋放出安全停泊區(qū)。一旦感應(yīng)器偵測(cè)并經(jīng)處理器判斷當(dāng)前的重力加速度超過(guò)安全值之后,控制器就會(huì)通過(guò)硬件控制磁頭停止讀寫(xiě)工作,并快速歸位,鎖定在專(zhuān)有的磁頭停泊區(qū)。這一系列動(dòng)作會(huì)在200毫秒內(nèi)完成。當(dāng)感應(yīng)裝置探測(cè)到加速度值恢復(fù)到正常值范圍之后,產(chǎn)品才會(huì)恢復(fù)工作。
Android多媒體框架的代碼在以下目錄中:external/opencore/.這個(gè)目錄是Android多媒體框架的根目錄,其中包含的子目錄如下所示:
* android:這里面是一個(gè)上層的庫(kù),它基于PVPlayer和PVAuthor的SDK實(shí)現(xiàn)了一個(gè)為Android使用的Player和Author
* baselibs:包含數(shù)據(jù)結(jié)構(gòu)和線(xiàn)程安全等內(nèi)容的底層庫(kù)
* codecs_v2:這是一個(gè)內(nèi)容較多的庫(kù),主要包含編解碼的實(shí)現(xiàn),以及一個(gè)OpenMAX的實(shí)現(xiàn)
* engines:包含PVPlayer和PVAuthor引擎的實(shí)現(xiàn)
*extern_libs_v2:包含了khronos的OpenMAX的頭文件
*fileformats:文件格式的據(jù)具體解析(parser)類(lèi)
* nodes:編解碼和文件解析的各個(gè)node類(lèi)
* oscl:操作系統(tǒng)兼容庫(kù)
* pvmi: 輸入輸出控制的抽象接口
* protocols:主要是與網(wǎng)絡(luò)相關(guān)的RTSP、RTP、HTTP等協(xié)議的相關(guān)內(nèi)容
* pvcommon:pvcommon庫(kù)文件的Android.mk文件,沒(méi)有源文件
*pvplayer:pvplayer庫(kù)文件的Android.mk文件,沒(méi)有源文件
* pvauthor:pvauthor庫(kù)文件的Android.mk文件,沒(méi)有源文件
* tools_v2:編譯工具以及一些可注冊(cè)的模塊
以下是部分測(cè)試代碼:
private SensorManager sensorMgr;
Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//保存上一次 x y z 的坐標(biāo)
float bx = 0;
float by = 0;
float bz = 0;
long btime = 0;//這一次的時(shí)間
sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
SensorEventListener lsn = new SensorEventListener() {
public void onSensorChanged(SensorEvent e) {
float x = e.values[SensorManager.DATA_X];
float y = e.values[SensorManager.DATA_Y];
float z = e.values[SensorManager.DATA_Z];
//計(jì)算出 X Y Z的數(shù)值下面可以根據(jù)這個(gè)數(shù)值來(lái)計(jì)算搖晃的速度了
//速度 = 路程/時(shí)間
//X軸的速度
float speadX = (x - bx) / (System.currentTimeMillis() - btime);
//y軸的速度
float speadY = (y - by) / (System.currentTimeMillis() - btime);
//z軸的速度
float speadZ = (z - bz) / (System.currentTimeMillis() - btime);
//這樣簡(jiǎn)單的速度就可以計(jì)算出來(lái),如果你想計(jì)算加速度也可以,在運(yùn)動(dòng)學(xué)里,加速度a與速度,
//位移都有關(guān)系:Vt=V0+at,S=V0*t+1/2at^2, S=(Vt^2-V0^2)/(2a),根據(jù)這些信息也可以求解a
bx = x;
by = y;
bz = z;
btime = System.currentTimeMillis();
}
public void onAccuracyChanged(Sensor s, int accuracy) {
}
};
// 注冊(cè)listener,第三個(gè)參數(shù)是檢測(cè)的精確度
sensorMgr.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android操作SQLite數(shù)據(jù)庫(kù)技巧總結(jié)》、《Android操作json格式數(shù)據(jù)技巧總結(jié)》、《Android數(shù)據(jù)庫(kù)操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android編程開(kāi)發(fā)之SD卡操作方法匯總》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android編程實(shí)現(xiàn)的重力感應(yīng)示例代碼
- Android基于Sensor感應(yīng)器獲取重力感應(yīng)加速度的方法
- Android重力傳感器實(shí)現(xiàn)滾動(dòng)的彈球
- Android 重力傳感器在游戲開(kāi)發(fā)中的應(yīng)用
- Android 物理游戲之重力系統(tǒng)開(kāi)發(fā)示例代碼
- Android利用方向傳感器獲得手機(jī)的相對(duì)角度實(shí)例說(shuō)明
- Android 傳感器--光照傳感器詳解及使用
- Android利用傳感器實(shí)現(xiàn)微信搖一搖功能
- Android編程中光線(xiàn)傳感器的調(diào)用方法詳解
- Android開(kāi)發(fā)獲取重力加速度和磁場(chǎng)強(qiáng)度的方法
相關(guān)文章
Flutter基于Dart Unwrapping Multiple Optional小技巧
這篇文章主要為大家介紹了Flutter Unwrapping Multiple Optional打開(kāi)多個(gè)選項(xiàng)小技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
利用Flutter實(shí)現(xiàn)背景圖片毛玻璃效果實(shí)例
Flutter沒(méi)有單獨(dú)的模糊處理容器,需要部件層層疊加實(shí)現(xiàn)模糊效果,下面這篇文章主要給大家介紹了關(guān)于利用Flutter實(shí)現(xiàn)背景圖片毛玻璃效果的相關(guān)資料,需要的朋友可以參考下2022-06-06
Android 自定義TextView實(shí)現(xiàn)文本內(nèi)容自動(dòng)調(diào)整字體大小
本文主要介紹了Android 自定義TextView實(shí)現(xiàn)文本內(nèi)容自動(dòng)調(diào)整字體大小以適應(yīng)TextView的大小的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
Android實(shí)現(xiàn)向Launcher添加快捷方式的方法
這篇文章主要介紹了Android實(shí)現(xiàn)向Launcher添加快捷方式的方法,涉及Android添加快捷方式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
Android RecycleView和線(xiàn)型布局制作聊天布局
大家好,本篇文章主要講的是Android RecycleView和線(xiàn)型布局制作聊天布局,感興趣的同學(xué)趕緊來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-01-01
Android中利用動(dòng)態(tài)加載實(shí)現(xiàn)手機(jī)淘寶的節(jié)日特效
這篇文章主要介紹了Android中利用動(dòng)態(tài)加載實(shí)現(xiàn)手機(jī)淘寶的節(jié)日特效,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
Android 自定義SeekBar動(dòng)態(tài)改變硬件音量大小實(shí)現(xiàn)和音量鍵的同步(推薦)
這篇文章主要介紹了 Android 自定義SeekBar動(dòng)態(tài)改變硬件音量大小實(shí)現(xiàn)和音量鍵的同步效果,整段代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
Android中的腦殘?jiān)O(shè)計(jì)總結(jié)
本篇文章是對(duì)Android中的腦殘?jiān)O(shè)計(jì)進(jìn)行了分析與介紹,需要的朋友參考下2013-05-05

