Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 利用Android傳感器開發指南針

利用Android傳感器開發指南針

編輯:關於Android編程

上文已介紹,水平傳感器傳回來的第一個參數值就是代表手機繞Z軸轉過的角度,也就是手機頂部與正北的夾角。在程序中通過檢查該夾角就可以實現指南針應用。其實思路很簡單,先准備一張圖片,該圖片方向指針指向正北。然後開發一個檢測方向的傳感器,當程序檢測到手機頂部繞Z軸轉過多少角度,就讓指南針圖片反向轉過多少度,這樣就實現了指針始終指向正北方。這也是指南針的原理。代碼如下: Activity:    
package com.home.compass;  
  
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.animation.Animation;  
import android.view.animation.RotateAnimation;  
import android.widget.ImageView;  
  
public class CompassTestActivity extends Activity implements  
        SensorEventListener {  
    // 定義顯示指南針圖片的組件   
    private ImageView image;  
    // 記錄指南針圖片轉過的角度   
    private float currentDegree = 0f;  
    // 定義真機的Sensor管理器   
    private SensorManager mSensorManager;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        image = (ImageView) findViewById(R.id.main_iv);  
        // 獲取真機的傳感器管理服務   
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
    }  
  
    @Override  
    protected void onResume() {  
        super.onResume();  
        // 為系統的方向傳感器注冊監聽器   
        mSensorManager.registerListener(this,  
                mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),  
                SensorManager.SENSOR_DELAY_GAME);  
    }  
  
    @Override  
    protected void onPause() {  
        super.onPause();  
        // 取消注冊   
        mSensorManager.unregisterListener(this);  
    }  
  
    @Override  
    public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  
    }  
  
    @Override  
    public void onSensorChanged(SensorEvent event) {  
        // 如果真機上觸發event的傳感器類型為水平傳感器類型   
        if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {  
            // 獲取繞Z軸轉過的角度   
            float degree = event.values[0];  
            // 創建旋轉動畫(反向轉過degree度)   
            RotateAnimation ra = new RotateAnimation(currentDegree, -degree,  
                    Animation.RELATIVE_TO_SELF, 0.5f,  
                    Animation.RELATIVE_TO_SELF, 0.5f);  
            // 設置動畫的持續時間   
            ra.setDuration(200);  
            // 設置動畫結束後的保留狀態   
            ra.setFillAfter(true);  
            // 啟動動畫   
            image.startAnimation(ra);  
            currentDegree = -degree;  
        }  
    }  
}  

package com.home.compass;

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.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;

public class CompassTestActivity extends Activity implements
SensorEventListener {
// 定義顯示指南針圖片的組件
private ImageView image;
// 記錄指南針圖片轉過的角度
private float currentDegree = 0f;
// 定義真機的Sensor管理器
private SensorManager mSensorManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
image = (ImageView) findViewById(R.id.main_iv);
// 獲取真機的傳感器管理服務
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}

@Override
protected void onResume() {
super.onResume();
// 為系統的方向傳感器注冊監聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_GAME);
}

@Override
protected void onPause() {
super.onPause();
// 取消注冊
mSensorManager.unregisterListener(this);
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

@Override
public void onSensorChanged(SensorEvent event) {
// 如果真機上觸發event的傳感器類型為水平傳感器類型
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
// 獲取繞Z軸轉過的角度
float degree = event.values[0];
// 創建旋轉動畫(反向轉過degree度)
RotateAnimation ra = new RotateAnimation(currentDegree, -degree,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
// 設置動畫的持續時間
ra.setDuration(200);
// 設置動畫結束後的保留狀態
ra.setFillAfter(true);
// 啟動動畫
image.startAnimation(ra);
currentDegree = -degree;
}
}
}

 

  布局XML:    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:gravity="center" >  
  
    <ImageView  
        android:id="@+id/main_iv"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:src="@drawable/znz" />  
  
</LinearLayout>  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >

    <ImageView
        android:id="@+id/main_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/znz" />

 

  </LinearLayout>這裡附上一張指南針的圖片:         \
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved