Android開發(fā)中方向傳感器定義與用法詳解【附指南針實(shí)現(xiàn)方法】
本文實(shí)例講述了Android開發(fā)中方向傳感器定義與用法。分享給大家供大家參考,具體如下:
Android中的方向傳感器在生活中是一個(gè)很好的應(yīng)用,典型的例子是指南針的使用,我們先來簡單介紹一下傳感器中三個(gè)參數(shù)x,y,z的含義,以一幅圖來說明。

補(bǔ)充說明:圖中的坐標(biāo)軸x,y,z和傳感器中的X,Y,Z沒有任何聯(lián)系!
如上圖所示,綠色部分表示一個(gè)手機(jī),帶有小圈那一頭是手機(jī)頭部
傳感器中的X:如上圖所示,規(guī)定X正半軸為北,手機(jī)頭部指向OF方向,此時(shí)X的值為0,如果手機(jī)頭部指向OG方向,此時(shí)X值為90,指向OH方向,X值為180,指向OE,X值為270
傳感器中的Y:現(xiàn)在我們將手機(jī)沿著BC軸慢慢向上抬起,即手機(jī)頭部不動(dòng),尾部慢慢向上翹起來,直到AD跑到BC右邊并落在XOY平面上,Y的值將從0~180之間變動(dòng),如果手機(jī)沿著AD軸慢慢向上抬起,即手機(jī)尾部不懂,直到BC跑到AD左邊并且落在XOY平面上,Y的值將從0~-180之間變動(dòng),這就是方向傳感器中Y的含義。
傳感器中的Z:現(xiàn)在我們將手機(jī)沿著AB軸慢慢向上抬起,即手機(jī)左邊框不動(dòng),右邊框慢慢向上翹起來,直到CD跑到AB右邊并落在XOY平面上,Z的值將從0~180之間變動(dòng),如果手機(jī)沿著CD軸慢慢向上抬起,即手機(jī)右邊框不動(dòng),直到AB跑到CD左邊并且落在XOY平面上,Z的值將從0~-180之間變動(dòng),這就是方向傳感器中發(fā)Z的含義。
了解了方向傳感器中X,Y,Z的含義之后下面我們就開始學(xué)習(xí)如何使用
首先我們創(chuàng)建一個(gè)傳感器管理器和一個(gè)傳感器監(jiān)聽器,管理器用來管理傳感器以及創(chuàng)建各種各樣的傳感器,監(jiān)聽器用來監(jiān)視傳感器的變化并且進(jìn)行相應(yīng)的操作
private SensorManager sensorManager;
private MySensorEventListener mySensorEventListener;
mySensorEventListener= new MySensorEventListener();//這個(gè)監(jiān)聽器當(dāng)然是我們自己定義的,在方向感應(yīng)器感應(yīng)到手機(jī)方向有變化的時(shí)候,我們可以采取相應(yīng)的操作,這里緊緊是將x,y,z的值打印出來
private final class MySensorEventListener implements SensorEventListener{
@Override
//可以得到傳感器實(shí)時(shí)測量出來的變化值
public void onSensorChanged(SensorEvent event) {
//方向傳感器
if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){
//x表示手機(jī)指向的方位,0表示北,90表示東,180表示南,270表示西
float x = event.values[SensorManager.DATA_X];
float y = event.values[SensorManager.DATA_Y];
float z = event.values[SensorManager.DATA_Z];
//tv_orientation是界面上的一個(gè)TextView標(biāo)簽,不再贅述
tv_orientation.setText("Orientation:"+x+","+y+","+z);
}
}
我們在onResume方法中創(chuàng)建一個(gè)方向傳感器,并向系統(tǒng)注冊監(jiān)聽器
protected void onResume() {
Sensor sensor_orientation=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sensorManager.registerListener(mySensorEventListener,sensor_orientation, SensorManager.SENSOR_DELAY_UI);
super.onResume();
}
最后我們在onPause()中注銷所有傳感器的監(jiān)聽,釋放方向感應(yīng)器資源!
protected void onPause() {
//注銷所有傳感器的監(jiān)聽
sensorManager.unregisterListener(mySensorEventListener);
super.onPause();
}
到此,有關(guān)方向傳感器的介紹完畢!
完整實(shí)例代碼點(diǎn)擊此處本站下載。
附:Android基于方向傳感器實(shí)現(xiàn)指南針功能
step1:新建一個(gè)項(xiàng)目Compass,并將一張指南針圖片導(dǎo)入到res/drawable-hdpi目錄中
step2:設(shè)計(jì)應(yīng)用的UI界面,main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/compass" android:id="@+id/imageView" /> </LinearLayout>
step3:MainActivity.java
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView imageView;
/** 傳感器管理器 */
private SensorManager manager;
private SensorListener listener = new SensorListener();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) this.findViewById(R.id.imageView);
imageView.setKeepScreenOn(true);//屏幕高亮
//獲取系統(tǒng)服務(wù)(SENSOR_SERVICE)返回一個(gè)SensorManager 對象
manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
@Override
protected void onResume() {
/**
* 獲取方向傳感器
* 通過SensorManager對象獲取相應(yīng)的Sensor類型的對象
*/
Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//應(yīng)用在前臺(tái)時(shí)候注冊監(jiān)聽器
manager.registerListener(listener, sensor,
SensorManager.SENSOR_DELAY_GAME);
super.onResume();
}
@Override
protected void onPause() {
//應(yīng)用不在前臺(tái)時(shí)候銷毀掉監(jiān)聽器
manager.unregisterListener(listener);
super.onPause();
}
private final class SensorListener implements SensorEventListener {
private float predegree = 0;
@Override
public void onSensorChanged(SensorEvent event) {
/**
* values[0]: x-axis 方向加速度
values[1]: y-axis 方向加速度
values[2]: z-axis 方向加速度
*/
float degree = event.values[0];// 存放了方向值
/**動(dòng)畫效果*/
RotateAnimation animation = new RotateAnimation(predegree, degree,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
animation.setDuration(200);
imageView.startAnimation(animation);
predegree=-degree;
/**
float x=event.values[SensorManager.DATA_X];
float y=event.values[SensorManager.DATA_Y];
float z=event.values[SensorManager.DATA_Z];
Log.i("XYZ", "x="+(int)x+",y="+(int)y+",z="+(int)z);
*/
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
}
step4:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.roco.sensor"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android操作SQLite數(shù)據(jù)庫技巧總結(jié)》、《Android操作json格式數(shù)據(jù)技巧總結(jié)》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
- android 傳感器(OnSensorChanged)使用介紹
- Android利用方向傳感器獲得手機(jī)的相對角度實(shí)例說明
- Android 利用方向傳感器實(shí)現(xiàn)指南針具體步驟
- Android利用Sensor(傳感器)實(shí)現(xiàn)指南針小功能
- Android編程實(shí)現(xiàn)獲取所有傳感器數(shù)據(jù)的方法
- Android開發(fā)中的重力傳感器用法實(shí)例詳解
- Android利用Sensor(傳感器)實(shí)現(xiàn)水平儀功能
- Android實(shí)現(xiàn)電子羅盤(指南針)方向傳感器的應(yīng)用
- Android實(shí)現(xiàn)計(jì)步傳感器功能
- Android傳感器的簡單使用方法
相關(guān)文章
Android開發(fā)之TextView控件用法實(shí)例總結(jié)
這篇文章主要介紹了Android開發(fā)之TextView控件用法,結(jié)合實(shí)例形式總結(jié)分析了TextView控件常用的屬性設(shè)置及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-02-02
詳解Android Studio正式簽名進(jìn)行調(diào)試的實(shí)現(xiàn)步驟
這篇文章主要介紹了詳解Android Studio正式簽名進(jìn)行調(diào)試的實(shí)現(xiàn)步驟的相關(guān)資料,需要的朋友可以參考下2017-07-07
NestScrollView嵌套R(shí)ecyclerView實(shí)現(xiàn)淘寶首頁滑動(dòng)效果
這篇文章主要介紹了NestScrollView嵌套R(shí)ecyclerView實(shí)現(xiàn)淘寶首頁滑動(dòng)效果,主要實(shí)現(xiàn)淘寶首頁嵌套滑動(dòng),中間tab吸頂效果,以及介紹NestScrollView嵌套R(shí)ecyclerView處理滑動(dòng)沖突的方法,需要的朋友可以參考下2021-12-12
Android編程程序?qū)崿F(xiàn)一鍵鎖屏的方法講解
今天小編就為大家分享一篇關(guān)于Android編程程序?qū)崿F(xiàn)一鍵鎖屏的方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
關(guān)于Kotlin委托你必須重視的幾個(gè)點(diǎn)
委托模式已經(jīng)被證明是實(shí)現(xiàn)繼承的一個(gè)很好的替代方式,下面這篇文章主要給大家介紹了關(guān)于Kotlin委托你必須重視的幾個(gè)點(diǎn),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01
Android手機(jī)開發(fā) 控件 TextView文字居中
本文主要介紹Android手機(jī)開發(fā)TextView居中的方法,希望能幫到大家。2016-05-05
通過案例分析Android WindowManager解析與騙取QQ密碼的過程
Windows Manager是一款窗口管理終端,可以遠(yuǎn)程連接到Linux的X桌面進(jìn)行管理,與服務(wù)器端產(chǎn)生一個(gè)session相互通信,通過本文給大家分享Android WindowManager解析與騙取QQ密碼的過程,需要的朋友參考下2016-01-01
Android權(quán)限操作之uses-permission詳解
這篇文章主要介紹了Android權(quán)限操作之uses-permission,較為詳細(xì)的分析了uses-permission常見權(quán)限操作類型與功能,需要的朋友可以參考下2016-10-10
彈出一個(gè)帶確認(rèn)和取消的dialog實(shí)例
下面小編就為大家?guī)硪黄獜棾鲆粋€(gè)帶確認(rèn)和取消的dialog實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03

