首先來說一說該指南針的實現思路:
程序先準備一張指南針圖片,該圖片上方向指針指向北方。接下來開發一個檢測方向的傳感器,程序檢測到手機頂部繞Z軸轉過多少度,讓指南針圖片反向轉多少度即可。由此可見指南針應用只要在界面中添加一張圖片,并讓圖片總是反向轉過反向傳感器返回的第一個角度值即可。
下面介紹一下方向傳感器:方向傳感器用于感應手機設備的擺放狀態。方向傳感器可以返回三個角度,這三個角度即可確定手機的擺放狀態。關于方向傳感器返回的三個角度的說明如下。
第一個角度:表示手機頂部朝向正北方的夾角。當手機繞著Z軸旋轉時,該角度值發送改變。例如當該角度為0時,表明手機頂部朝向正北;該角度為90時,代表手機頂部朝向正東;該角度為180時,代表手機頂部朝向正南;該角度為270時,代表手機頂部朝向正西。
第二個角度:表示手機頂部或尾部翹起的角度。當手機繞著X軸傾斜時,該角度值發送改變。該角度的取值范圍是-180~180。假設將手機屏幕朝上水平放在桌子上,如果桌子是完全水平的,該角度值應該是0。加入從手機頂部開始抬起,直到將手機沿X軸旋轉180度(屏幕向下水平放在桌面上),在這個旋轉過程中,該角度值會從0變化為-180。也就是說,從手機頂部抬起時,該角度值會逐漸減小,直到等于-180;如果從手機底部開始抬起,知道將手機沿X軸旋轉180度(屏幕向下水平放在桌面上),該角度值會從0變化為180。也就是說,從手機頂部抬起時,該角度值會逐漸增大,直到等于180。
第三個角度:表示手機左側或右側翹起的角度。當手機繞著Y軸傾斜時,該角度值發送改變。該角度的取值范圍是-90~90。假設將手機屏幕朝上水平放在桌子上,如果桌子是完全水平的,該角度值應該是0。假設將手機左側逐漸抬起,知道將手機沿Y軸旋轉90度(手機與桌面垂直),在這個旋轉過程中,該角度值會從0變化為-90。也就是說,從手機左側抬起時,該角度值會逐漸減小,直到等于-90;如果將手機右側逐漸抬起,知道將手機沿Y軸旋轉90度(手機與桌面垂直),在這個旋轉過程中,該角度值會從0變化為90。也就是說,從手機右側抬起時,該角度值會逐漸增大,直到等于90。
step1:新建一個項目Compass,并將一張指南針圖片導入到res/drawable-hdpi目錄中

compass.png

step2:設計應用的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
package cn.roco.sensor; 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);//屏幕高亮 //獲取系統服務(SENSOR_SERVICE)返回一個SensorManager 對象 manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } @Override protected void onResume() { /** * 獲取方向傳感器 * 通過SensorManager對象獲取相應的Sensor類型的對象 */ Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION); //應用在前臺時候注冊監聽器 manager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME); super.onResume(); } @Override protected void onPause() { //應用不在前臺時候銷毀掉監聽器 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>
step5:部署應用到真機環境中 就可以查看運行的效果啦!
我的Android進階之旅------>Android利用Sensor(傳感器)實現水平儀功能的小例
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答