Android開發(fā)中方向傳感器定義與用法詳解【附指南針實現(xiàn)方法】
本文實例講述了Android開發(fā)中方向傳感器定義與用法。分享給大家供大家參考,具體如下:
Android中的方向傳感器在生活中是一個很好的應用,典型的例子是指南針的使用,我們先來簡單介紹一下傳感器中三個參數(shù)x,y,z的含義,以一幅圖來說明。
補充說明:圖中的坐標軸x,y,z和傳感器中的X,Y,Z沒有任何聯(lián)系!
如上圖所示,綠色部分表示一個手機,帶有小圈那一頭是手機頭部
傳感器中的X:如上圖所示,規(guī)定X正半軸為北,手機頭部指向OF方向,此時X的值為0,如果手機頭部指向OG方向,此時X值為90,指向OH方向,X值為180,指向OE,X值為270
傳感器中的Y:現(xiàn)在我們將手機沿著BC軸慢慢向上抬起,即手機頭部不動,尾部慢慢向上翹起來,直到AD跑到BC右邊并落在XOY平面上,Y的值將從0~180之間變動,如果手機沿著AD軸慢慢向上抬起,即手機尾部不懂,直到BC跑到AD左邊并且落在XOY平面上,Y的值將從0~-180之間變動,這就是方向傳感器中Y的含義。
傳感器中的Z:現(xiàn)在我們將手機沿著AB軸慢慢向上抬起,即手機左邊框不動,右邊框慢慢向上翹起來,直到CD跑到AB右邊并落在XOY平面上,Z的值將從0~180之間變動,如果手機沿著CD軸慢慢向上抬起,即手機右邊框不動,直到AB跑到CD左邊并且落在XOY平面上,Z的值將從0~-180之間變動,這就是方向傳感器中發(fā)Z的含義。
了解了方向傳感器中X,Y,Z的含義之后下面我們就開始學習如何使用
首先我們創(chuàng)建一個傳感器管理器和一個傳感器監(jiān)聽器,管理器用來管理傳感器以及創(chuàng)建各種各樣的傳感器,監(jiān)聽器用來監(jiān)視傳感器的變化并且進行相應的操作
private SensorManager sensorManager; private MySensorEventListener mySensorEventListener; mySensorEventListener= new MySensorEventListener();//這個監(jiān)聽器當然是我們自己定義的,在方向感應器感應到手機方向有變化的時候,我們可以采取相應的操作,這里緊緊是將x,y,z的值打印出來 private final class MySensorEventListener implements SensorEventListener{ @Override //可以得到傳感器實時測量出來的變化值 public void onSensorChanged(SensorEvent event) { //方向傳感器 if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){ //x表示手機指向的方位,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是界面上的一個TextView標簽,不再贅述 tv_orientation.setText("Orientation:"+x+","+y+","+z); } }
我們在onResume方法中創(chuàng)建一個方向傳感器,并向系統(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)聽,釋放方向感應器資源!
protected void onPause() { //注銷所有傳感器的監(jiān)聽 sensorManager.unregisterListener(mySensorEventListener); super.onPause(); }
到此,有關(guān)方向傳感器的介紹完畢!
完整實例代碼點擊此處本站下載。
附:Android基于方向傳感器實現(xiàn)指南針功能
step1:新建一個項目Compass,并將一張指南針圖片導入到res/drawable-hdpi目錄中
step2:設(shè)計應用的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)服務(SENSOR_SERVICE)返回一個SensorManager 對象 manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } @Override protected void onResume() { /** * 獲取方向傳感器 * 通過SensorManager對象獲取相應的Sensor類型的對象 */ Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION); //應用在前臺時候注冊監(jiān)聽器 manager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME); super.onResume(); } @Override protected void onPause() { //應用不在前臺時候銷毀掉監(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];// 存放了方向值 /**動畫效果*/ 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ā)入門與進階教程》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android操作SQLite數(shù)據(jù)庫技巧總結(jié)》、《Android操作json格式數(shù)據(jù)技巧總結(jié)》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Android使用ExpandableListView實現(xiàn)三層嵌套折疊菜單
這篇文章主要介紹了Android使用ExpandableListView實現(xiàn)三層嵌套折疊菜單,對布局感興趣的同學可以參考下2021-04-04Android中activity跳轉(zhuǎn)按鈕事件的四種寫法
這篇文章主要介紹了Android中activity跳轉(zhuǎn)按鈕事件的四種寫法,下文中包括四個activity的內(nèi)容詳解,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-10-10Android Studio finish()方法的使用與解決app點擊“返回”(直接退出)
這篇文章主要介紹了Android Studio finish()方法的使用與解決app點擊“返回”(直接退出),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Android 物理游戲之重力系統(tǒng)開發(fā)示例代碼
介紹Android 物理游戲之重力系統(tǒng),這里提供了詳細的資料整理,并附示例代碼和實現(xiàn)效果圖,有興趣的小伙伴可以參考下2016-08-08