Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> 安卓省電與加速 >> Android實戰技巧之四十二:加速度傳感器

Android實戰技巧之四十二:加速度傳感器

編輯:安卓省電與加速

歡迎來到傳感器的世界。
傳感器字面上的意思就是傳遞感覺的儀器,哪些感覺呢?
視覺、聽覺、味覺、觸覺、嗅覺等等。
所以有人說,傳感器的存在和發展,讓物體有了觸覺、味覺和嗅覺等感官,讓物體慢慢變得活了起來。
當前Android設備中已經集成進數十個傳感器,我們比較常見的有加速度傳感器、陀螺儀、地磁傳感器等。
雖然種類繁多,但在Framework中僅僅提供了幾個類和接口就把傳感器相關的功能搞定了。下面我們以加速度傳感器為例,引領大家走入Android傳感器的世界。

傳感器世界的坐標系

這裡寫圖片描述
x軸:從左到右
y軸:從下到上
z軸:從內到外

這個坐標系與Android 2D API中的不同,傳感器中的返回值都以此坐標系為准。

API概況

sensor相關API被放到了android.hardware包下,我們主要使用的類有三個:Sensor、SensorEvent、SensorManager以及一個SensorEventListener接口。
SensorManager順其自然的擔任起管理的工作,負責注冊監聽某Sensor的狀態;Sensor的數據通過SensorEvent返回。

獲得設備中所有可用sensor

SensorManager提供getSensorList方法,傳入TYPE_ALL,即可得到當前設備所有傳感器。

SensorManager sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        List sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
        mTvInfo.setText(sensors:  + sensors.size());
        Log.d(TAG, sensors:  + sensors.size());
        for (int i = 0;i < sensors.size();++i) {
            Log.d(TAG,sensor name: +sensors.get(i).getName());
            Log.d(TAG,sensor vendor: +sensors.get(i).getVendor());
            Log.d(TAG,sensor power: +sensors.get(i).getPower());
            Log.d(TAG, sensor resolution:  + sensors.get(i).getResolution());
        }

Sensor編碼套路

public class SensorActivity extends Activity, implements SensorEventListener {
     private final SensorManager mSensorManager;
     private final Sensor mAccelerometer;

     public SensorActivity() {
         mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
         mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
     }

     protected void onResume() {
         super.onResume();
         mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
     }

     protected void onPause() {
         super.onPause();
         mSensorManager.unregisterListener(this);
     }

     public void onAccuracyChanged(Sensor sensor, int accuracy) {
     }

     public void onSensorChanged(SensorEvent event) {
     }
 }

不同的傳感器被提取共性後,由上面的編碼套路規定起來,一切就變得如此簡單啦。

加速度傳感器的背景

這裡的加速度特指重力加速度,所以在靜止時重力傳感器的返回值與加速度傳感器值相同。
地表上靜止物體的重力加速度約為9.8 m/s^2.
借用SensorManager中的常量:
public static final float STANDARD_GRAVITY = 9.80665F;

我們可以借助三軸上的值來確定設備的狀態(請參考上面的坐標圖),比如:
1、當x軸的值接近重力加速度時,說明設備的左邊朝下。
2、當x軸的值接近負的g值時,說明設備的右邊朝下。
3、當y軸的值接近g值時,說明設備的下邊超下(與上圖一樣)。
4、當y軸的值接近負的g值時,說明設備的上邊朝下(倒置)。
5、當z軸的值接近g值時,說明設備的屏幕朝上。
6、當z軸的值接近負的g值時,說明設備屏幕朝下。
具體代碼如下:


    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        Log.d(linc, value size:  + sensorEvent.values.length);
        float xValue = sensorEvent.values[0];// Acceleration minus Gx on the x-axis
        float yValue = sensorEvent.values[1];//Acceleration minus Gy on the y-axis
        float zValue = sensorEvent.values[2];//Acceleration minus Gz on the z-axis
        mTvInfo.setText(x軸: +xValue+  y軸: +yValue+  z軸: +zValue);
        if(xValue > mGravity) {
            mTvInfo.append(
重力指向設備左邊);
        } else if(xValue < -mGravity) {
            mTvInfo.append(
重力指向設備右邊);
        } else if(yValue > mGravity) {
            mTvInfo.append(
重力指向設備下邊);
        } else if(yValue < -mGravity) {
            mTvInfo.append(
重力指向設備上邊);
        } else if(zValue > mGravity) {
            mTvInfo.append(
屏幕朝上);
        } else if(zValue < -mGravity) {
            mTvInfo.append(
屏幕朝下);
        }
    }

 

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