• 2. 传感器:动作传感器


    动作传感器概述

          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 = "
    " + "X:"
     51                     + (event.values[0] - gravity[0]) + "
    " + "Y:"
     52                     + (event.values[1] - gravity[1]) + "
    " + "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 }
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    css整理-06 表和列表
    css整理-05 边框,背景和浮动,定位
    css整理-04 基本视觉格式化
    css整理-03 文本
    css整理-02 颜色和字体
    no-jquery 05 Utilities
    no-jquery 04 Events
    使用nodejs写个服务器小程序
    快速判断数组中每个对象同一属性值是否相同
    飞快验证对象是否为空
  • 原文地址:https://www.cnblogs.com/androidsj/p/3856150.html
Copyright © 2020-2023  润新知