淺入淺出Android(006):實時獲取加速計Accelerometer的信息

一、關於加速計Accelerometer

這篇文章對傳感器作了些講解。

Android手機通常會自帶幾個傳感器,加速計Accelerometer是常見的一種,一些遊戲APP就用到了加速計。加速計計算的是三個方向上加速度,單位是加速度基本單位m/s 2。這三個方向分別是水平的兩個互相垂直的方向,一個與重力相同的方向。因此咱們經過加速計獲取的數據就是三個加速度。

水平的兩個方向,通常是這樣的:把手機放平,其中一個加速度方向是與手機的短邊平行的,另外一個方向是與手機的長邊平行。

在android系統中傳感器的運行狀態是經過系統服務SensorManager提供的。

筆者的虛擬機中Android系統版本爲4.4。

二、如何獲取加速計信息


如下代碼參考自 http://webtutsdepot.com/2011/08/20/android-sdk-accelerometer-example-tutorial/

2.一、新建Android項目

2.二、修改佈局文件layout/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"
        >
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="加速計實時數據"
            />
    <TextView
            android:id="@+id/xcoor"
            android:text="X Coordinate: "
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
    <TextView
            android:id="@+id/ycoor"
            android:text="Y Coordinate: "
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
    <TextView
            android:id="@+id/zcoor"
            android:text="Z Coordinate: "
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
</LinearLayout>

2.三、修改java代碼

package com.example.HelloWorld;

import android.app.Activity;
import android.os.Bundle;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.TextView;


public class MyActivity extends Activity implements SensorEventListener{

    private SensorManager sensorManager;

    TextView xCoor; // declare X axis object
    TextView yCoor; // declare Y axis object
    TextView zCoor; // declare Z axis object

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        xCoor=(TextView)findViewById(R.id.xcoor); // create X axis object
        yCoor=(TextView)findViewById(R.id.ycoor); // create Y axis object
        zCoor=(TextView)findViewById(R.id.zcoor); // create Z axis object

        sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
        // add listener. The listener will be MyActivity (this) class
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_NORMAL);

    }

    // 當精度發生變化時調用
    public void onAccuracyChanged(Sensor sensor,int accuracy){

    }

    // 當sensor事件發生時候調用
    public void onSensorChanged(SensorEvent event){

        // check sensor type
        if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){

            // assign directions
            float x=event.values[0];
            float y=event.values[1];
            float z=event.values[2];

            xCoor.setText("X: "+x);
            yCoor.setText("Y: "+y);
            zCoor.setText("Z: "+z);
        }
    }

    @Override
    protected void onDestroy() {
        sensorManager.unregisterListener(this);
        super.onDestroy();
    }
}

運行效果以下: html



下面對代碼略做分析:
sensorManager.registerListener(this,               
             sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
             SensorManager.SENSOR_DELAY_NORMAL);


registerListener()第一個參數指定監聽器,第二個參數指定傳感器,第三個參數指定監聽器更新的頻率。第一個參數之因此使用this,是由於 MyActivity繼承了SensorEventListener接口。該接口中只有兩個方法:
//傳感器精度改變時調用
public abstract void onAccuracyChanged (Sensor sensor, int accuracy) 

//傳感器獲取的數值改變時調用
public abstract void onSensorChanged (SensorEvent event)
上面的示例中並無去具體化onAccuracyChanged()方法,而具體化了onSensorChanged()方法。
相關文章
相關標籤/搜索