Android方向傳感器的使用方法
在應(yīng)用程序中使用SensorManager.getOrientation()來(lái)獲得原始數(shù)據(jù)。
public static float[] getOrientation (float[] R, float[] values)
第一個(gè)參數(shù)是R用來(lái)保存磁場(chǎng)和加速度的數(shù)據(jù),通過(guò)該函數(shù)獲取方位角。
第二個(gè)參數(shù)是函數(shù)輸出,數(shù)據(jù)自動(dòng)填充。
- values[0]:方向角,但用(磁場(chǎng)+加速度)得到的數(shù)據(jù)范圍是(-180~180),也就是說(shuō),0表示正北,90表示正東,180/-180表示正南,-90表示正西。而直接通過(guò)方向感應(yīng)器數(shù)據(jù)范圍是(0~359)360/0表示正北,90表示正東,180表示正南,270表示正西。
- values[1]:pitch 傾斜角即由靜止?fàn)顟B(tài)開始,前后翻轉(zhuǎn),手機(jī)頂部往上抬起(0~-90),手機(jī)尾部往上抬起(0~90)
- values[2]:roll 旋轉(zhuǎn)角 即由靜止?fàn)顟B(tài)開始,左右翻轉(zhuǎn),手機(jī)左側(cè)抬起(0~90),手機(jī)右側(cè)抬起(0~-90)
通過(guò)函數(shù)getRotationMatrix獲取R
public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
注冊(cè)監(jiān)聽
sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_GAME); sensorManager.registerListener(this, mag_sensor,SensorManager.SENSOR_DELAY_GAME);
主要代碼
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener{
private SensorManager sensorManager;
private Sensor acc_sensor;
private Sensor mag_sensor;
//加速度傳感器數(shù)據(jù)
float accValues[] = new float[3];
//地磁傳感器數(shù)據(jù)
float magValues[] = new float[3];
//旋轉(zhuǎn)矩陣,用來(lái)保存磁場(chǎng)和加速度的數(shù)據(jù)
float r[] = new float[9];
//模擬方向傳感器的數(shù)據(jù)(原始數(shù)據(jù)為弧度)
float values[] = new float[3];
TextView showTV = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show_change=(TextView) findViewById(R.id.show_change);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
acc_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mag_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
// 注冊(cè)監(jiān)聽:
sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this, mag_sensor,SensorManager.SENSOR_DELAY_GAME);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// 回調(diào)方法
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
accValues = event.values.clone();
}
else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
magValues = event.values.clone();
}
/**
* r:要填充的旋轉(zhuǎn)數(shù)組
* I: 將磁場(chǎng)數(shù)據(jù)轉(zhuǎn)換進(jìn)實(shí)際的重力坐標(biāo)中,一般默認(rèn)情況下可以設(shè)置為null
* gravity: 加速度傳感器數(shù)據(jù)
* geomagnetic:地磁傳感器數(shù)據(jù)
*/
SensorManager.getRotationMatrix(r, null, accValues, magValues);
/**
* R:旋轉(zhuǎn)數(shù)組
* values:模擬方向傳感器的數(shù)據(jù)
*/
SensorManager.getOrientation(r, values);
//將弧度轉(zhuǎn)化為角度后輸出
StringBuffer buff = new StringBuffer();
for(float value : values){
value=(float) Math.toDegrees(value);
buff.append(value + " ");
}
showTV.setText(buff.toString());
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)計(jì)步傳感器功能
- Android開發(fā)獲取傳感器數(shù)據(jù)的方法示例【加速度傳感器,磁場(chǎng)傳感器,光線傳感器,方向傳感器】
- Android編程基于距離傳感器控制手機(jī)屏幕熄滅的方法詳解
- Android開發(fā)中方向傳感器定義與用法詳解【附指南針實(shí)現(xiàn)方法】
- Android開發(fā)中的重力傳感器用法實(shí)例詳解
- Android 獲取傳感器列表整理及簡(jiǎn)單實(shí)例
- Android亮屏速度分析總結(jié)
- Android四大組件之Activity詳解
- Android四大組件之Service詳解
- Android傳感器SensorEventListener之加速度傳感器
相關(guān)文章
Android 媒體開發(fā)之MediaPlayer狀態(tài)機(jī)接口方法實(shí)例解析
這篇文章主要介紹了Android 媒體開發(fā)之MediaPlayer狀態(tài)機(jī)接口方法實(shí)例解析,需要的朋友可以參考下2017-08-08
flutter傳遞值到任意widget(當(dāng)需要widget嵌套使用需要傳遞值的時(shí)候)
這篇文章主要介紹了flutter傳遞值到任意widget(當(dāng)需要widget嵌套使用需要傳遞值的時(shí)候),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Android編程實(shí)現(xiàn)添加低電流提醒功能的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)添加低電流提醒功能的方法,涉及Android廣播監(jiān)聽及電源監(jiān)控等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Android UI 之實(shí)現(xiàn)多級(jí)樹形列表TreeView示例
這篇文章主要介紹了Android UI 之實(shí)現(xiàn)多級(jí)列表TreeView示例,TreeView就是在Windows中常見的多級(jí)列表樹,有興趣的可以了解一下。2017-03-03
Android的Launcher啟動(dòng)器中添加快捷方式及小部件實(shí)例
這篇文章主要介紹了在Android的Launcher啟動(dòng)器中添加快捷方式及窗口小部件的方法,包括在自己的應(yīng)用程序中添加窗口小部件AppWidget的例子,需要的朋友可以參考下2016-02-02
詳解如何在Flutter中獲取設(shè)備標(biāo)識(shí)符
這篇文章主要為大家介紹了幾種通過(guò)Flutter讀取設(shè)備信息的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下2022-04-04
Android編程實(shí)現(xiàn)讀取工程中的txt文件功能
這篇文章主要介紹了Android編程實(shí)現(xiàn)讀取工程中的txt文件功能,結(jié)合實(shí)例形式詳細(xì)分析了Android讀取txt文件的原理、操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02
Android Canvas之drawBitmap方法案例詳解
這篇文章主要介紹了Android Canvas之drawBitmap方法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Android 中ContentProvider的實(shí)例詳解
這篇文章主要介紹了Android 中ContentProvider的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09

