Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android利用方向傳感器獲得手機的相對角度

Android利用方向傳感器獲得手機的相對角度

編輯:Android開發教程

1.android 的坐標系是如何定義x, y z 軸的。

x軸的方向是沿著屏幕的水平方向從左向右,如果手 機不是正方形的話,較短的邊需要水平放置,較長的邊需要垂直放置。

Y軸的方向是從屏幕的左下角開 始沿著屏幕的的垂直方向指向屏幕的頂端。

將手機放在桌子上,z軸的方向是從手機指向天空。

2.方向傳感器

在方向傳感器中values變量的3個值都表 示度數,它們的含義如下:

values[0]:該值表示方位,也就是 手機繞著Z軸旋轉的角度。0表示北(North);90表示東(East);180表示南(South);270表示西(West) 。如果values[0]的值正好是這4個值,並且手機是水平放置,表示手機的正前方就是這4個方向。可以利用這 個特性來實現電子羅盤,實例76將詳細介紹電子羅盤的實現過程。

values[1]: 該值表示傾斜度,或手機翹起的程度。當手機繞著X軸傾斜時該值發生變化。values[1]的取值范圍是-180≤ values[1]≤180。

假設將手機屏幕朝上水平放在桌子上,這時如果桌子是完全水平的,values[1]的值 應該是0(由於很少有桌子是絕對水平的,因此,該值很可能不為0,但一般都是-5和5之間的某個值)。這時 從手機頂部開始抬起,直到將手機沿X軸旋轉180度(屏幕向下水平放在桌面上)。在這個旋轉過程中, values[1]會在0到-180之間變化,也就是說,從手機頂部抬起時,values[1]的值會逐漸變小,直到等於-180 。如果從手機底部開始抬起,直到將手機沿X軸旋轉180度,這時values[1]會在0到180之間變化。也就是 values[1]的值會逐漸增大,直到等於180。可以利用values[1]和下面要介紹的values[2]來測量桌子等物體的 傾斜度。

values[2]:表示手機沿著Y軸的滾動角度。取值范圍 是-90≤values[2]≤90。假設將手機屏幕朝上水平放在桌面上,這時如果桌面是平的,values[2]的值應為0。 將手機左側逐漸抬起時,values[2]的值逐漸變小,直到手機垂直於桌面放置,這時values[2]的值是-90。將 手機右側逐漸抬起時,values[2]的值逐漸增大,直到手機垂直於桌面放置,這時values[2]的值是90。在垂直 位置時繼續向右或向左滾動,values[2]的值會繼續在-90至90之間變化。

下面以一個實例說明其應用 方法

package com.example.sensortest;  
      
import java.util.List;  
      
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.util.Log;  
import android.view.Menu;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.TextView;  
      
public class SensorTest extends Activity implements SensorEventListener{  
          
     private SensorManager sensorManager = null;  
        private Sensor gyroSensor = null;  
        private TextView vX;  
        private TextView vY;  
        private TextView vZ;  
        private TextView v;  
        private Button button;  
        private static final float NS2S = 1.0f / 1000000000.0f;  
        private float timestamp;  
        private float[] angle = new float[3];    
      
    @SuppressWarnings("deprecation")  
    @Override
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_sensor_test);  
        vX = (TextView) findViewById(R.id.vx);  
        vY = (TextView)findViewById(R.id.vy);  
        vZ = (TextView)findViewById(R.id.vz);  
        v = (TextView)findViewById(R.id.v);   
        button = (Button)findViewById(R.id.button);  
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
        gyroSensor = sensorManager  
                .getDefaultSensor(Sensor.TYPE_ORIENTATION);  
        vX.setText("!!!!!!");  
        button.setOnClickListener(new OnClickListener() {  
                  
            @Override
            public void onClick(View arg0) {  
                // TODO Auto-generated method stub  
                //聲明可變字符串  
                StringBuffer sb = new StringBuffer();  
                //獲取手機全部的傳感器  
                List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);  
                //迭代輸出獲得上的傳感器  
                for (Sensor sensor : sensors) {  
                //System.out.println(sensor.getName().toString());  
                sb.append(sensor.getName().toString());  
                sb.append("\n");  
                Log.i("Sensor", sensor.getName().toString());  
                }  
                //給文本控件賦值  
                v.setText(sb.toString());  
            }  
        });  
    }  
     public SensorTest() {  
        // TODO Auto-generated constructor stub  
        angle[0] = 0;  
        angle[1] = 0;  
        angle[2] = 0;  
        timestamp = 0;  
    }  
      
      
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.activity_sensor_test, menu);  
        return true;  
    }  
      
    @Override
    protected void onPause() {  
        // TODO Auto-generated method stub  
        super.onPause();  
         sensorManager.unregisterListener(this); // 解除監聽器注冊  
    }  
      
    @Override
    protected void onResume() {  
        // TODO Auto-generated method stub  
        super.onResume();  
         sensorManager.registerListener(this, gyroSensor,  
                    SensorManager.SENSOR_DELAY_NORMAL);  //為傳感器注冊監聽器  
    }  
      
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {  
        // TODO Auto-generated method stub  
              
    }  
      
    @Override
    public void onSensorChanged(SensorEvent event) {  
        // TODO Auto-generated method stub  
//      if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)    
//        {    
//       return;    
//        }  
              
//      if (timestamp != 0) {  
//          final float dT = (event.timestamp - timestamp) * NS2S;  
//          angle[0] += event.values[0] * dT * 100;  
//          angle[1] += event.values[1] * dT * 100;  
//          angle[2] += event.values[2] * dT * 100;  
//         }  
//         timestamp = event.timestamp;  
//           
//           
//         vX.setText("X: " + Float.toString(angle[0]));  
//         vY.setText("Y: " + Float.toString(angle[1]));   
//         vZ.setText("Z: " + Float.toString(angle[2]));  
              
//      方向傳感器提供三個數據,分別為azimuth、pitch和roll。  
//  
//      azimuth:方位,返回水平時磁北極和Y軸的夾角,范圍為0°至360°。  
//      0°=北,90°=東,180°=南,270°=西。  
//  
//      pitch:x軸和水平面的夾角,范圍為-180°至180°。  
//      當z軸向y軸轉動時,角度為正值。  
//  
//      roll:y軸和水平面的夾角,由於歷史原因,范圍為-90°至90°。  
//      當x軸向z軸移動時,角度為正值。  
              
         vX.setText("Orientation X: " + event.values[0]);  
         vY.setText("Orientation Y: " + event.values[1]);  
         vZ.setText("Orientation Z: " + event.values[2]);  
              
    }  
      
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved