2. 感應器:動作感應器

來源:互聯網
上載者:User

標籤:android   style   blog   http   java   color   

動作感應器概述

      Android平台支援一些用於監視裝置動作的感應器(這樣的感應器共有5個)。其中兩個(加速感應器和陀螺儀感應器)是純的硬體感應器。另外三個(重力感應器、線性加速感應器和旋轉向量感應器)可能是硬體感應器,也可能是軟體感應器。例如,在一些Android裝置中,這些基於軟體的感應器會從加速和磁力感應器中擷取資料,但在另一些Android裝置中也可能從陀螺儀感應器中擷取資料。也就是說,同一種基於軟體的感應器在不同的Android裝置中回傳的資料可能來自不同的硬體感應器。所以基於軟體的同一種感應器在不同的裝置中可能精確度、使用範圍有所不同。大多數高端Android裝置都會有加速感應器,還有一些擁有陀螺儀感應器。

動作感應器的作用

      動作感應器對於監測裝置的移動非常有用,例如,傾斜、震動、旋轉和擺動都屬於動作感應器的監測範圍。裝置的移動通常是對使用者輸入的直接反應。例如,使用者正在遊戲中飆車,或控制遊戲中的一個小球)。除此之外,裝置所處的實體環境也會反應在裝置的動作上,例如,使用者正常駕駛汽車,而這是Android裝置正安靜地躺在旁邊的座椅上,儘管裝置沒有移動,但會隨著車的行駛而不斷震動,而且裝置也會隨著汽車的移動而移動。

      對於第一種情況,可以對裝置本身的相對位置進行監測。而對於第二種情況,需要考慮到裝置以外的參照系。動作感應器本身一般並不會用於監測裝置的位置,關於裝置的位置需要用其他類型的感應器進行監測,例如,磁場感應器。

動作感應器的回傳資料

      所有的動作感應器都會返回三個浮點數的值(通過長度為3的數組返回),但對於不同的感應器,這三個只的意義不同。例如,對於加速感應器,會返回三個座標軸的資料。對於陀螺儀感應器,會返回三個座標軸的旋轉角速度。

加速感應器

# 裝置從左至右推動,X軸加速度為正值。# 裝置朝著自己推動,Y軸加速度為正值。

# 如果朝著天空以A m/s^2的加速度推動,那麼Z軸的加速度為A + 9.81,所以如果計算實際的加速度(抵消重力加速

   度),需要減9.81。

Demo
<?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:id="@+id/tvAccelerometer"android:layout_width="fill_parent" android:layout_height="wrap_content" /><TextView android:id="@+id/tvMagentic" android:layout_width="fill_parent"android:layout_height="wrap_content" /><TextView android:id="@+id/tvLight" android:layout_width="fill_parent"android:layout_height="wrap_content" android:layout_marginTop="10dp" /><TextView android:id="@+id/tvOrientation"android:layout_width="fill_parent" android:layout_height="wrap_content"android:layout_marginTop="10dp" /><TextView android:id="@+id/tvSensors" android:layout_width="fill_parent"android:layout_height="wrap_content" android:layout_marginTop="10dp" /></LinearLayout> 
  1 package cn.eoe.motion.sensor;  2   3 import android.app.Activity;  4 import android.hardware.Sensor;  5 import android.hardware.SensorEvent;  6 import android.hardware.SensorEventListener;  7 import android.hardware.SensorManager;  8 import android.os.Bundle;  9 import android.util.Log; 10 import android.widget.TextView; 11  12 public class MotionSensorActivity extends Activity implements 13         SensorEventListener { 14  15     private TextView tvAccelerometer; 16     private SensorManager mSensorManager; 17     private float[] gravity = new float[3]; 18  19     @Override 20     protected void onCreate(Bundle savedInstanceState) { 21         super.onCreate(savedInstanceState); 22         setContentView(R.layout.activity_motion_sensor); 23  24         tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer); 25  26         mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 27  28     } 29  30     @Override 31     public void onAccuracyChanged(Sensor sensor, int accuracy) { 32  33     } 34  35     @Override 36     public void onSensorChanged(SensorEvent event) { 37         switch (event.sensor.getType()) { 38         case Sensor.TYPE_ACCELEROMETER: //  加速度感應器 39             final float alpha = (float) 0.8; 40             /** 41              *  event.values[0] 沿X軸加速度。 42              *  event.values[1] 沿Y軸加速度。 43              *  event.values[2] 沿Z軸加速度。 44              *  gravity 處理重力加速度的雜音(不能能百分之百去掉)。 45              */ 46             gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 47             gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 48             gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 49  50             String accelerometer = "\n" + "X:" 51                     + (event.values[0] - gravity[0]) + "\n" + "Y:" 52                     + (event.values[1] - gravity[1]) + "\n" + "Z:" 53                     + (event.values[2] - gravity[2]); 54             Log.d("z", String.valueOf(event.values[2] - gravity[2])); 55             tvAccelerometer.setText(accelerometer); 56              57             // 9.81m/s^2 58             break; 59         case Sensor.TYPE_GRAVITY:  //  重力感應器 60             gravity[0] = event.values[0]; 61             gravity[1] = event.values[1]; 62             gravity[2] = event.values[2]; 63             break; 64         case Sensor.TYPE_PROXIMITY:  // 臨近感應器 65             setTitle(String.valueOf(event.values[0])); 66             break; 67         default: 68             break; 69         } 70  71     } 72  73     protected void onResume() { 74         super.onResume(); 75         /** 76          * 註冊感應器 77          *  78          * 第二個參數,所註冊的感應器。 79          * 第三個參數,採樣頻率數值。SENSOR_DELAY_FASTEST:最快的。 80          */ 81         mSensorManager.registerListener(this, 82                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 83                 SensorManager.SENSOR_DELAY_UI);  // 加速度 84         mSensorManager.registerListener(this, 85                 mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY), 86                 SensorManager.SENSOR_DELAY_FASTEST);  // 重力感應器 87         mSensorManager.registerListener(this, 88                 mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY), 89                 SensorManager.SENSOR_DELAY_UI);  //  90     } 91  92     @Override 93     protected void onPause() { 94         super.onPause(); 95         // 卸載所有感應器 96         mSensorManager.unregisterListener(this); 97  98     } 99 100 }

 

                  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.