• Android加速度传感器原理


    这里我们将通过一个”摇一摇”应用来说明如何使用加速度传感器.但在开发之前,我们先对加速度传感器进行一些简单的介绍。
    加速的是描述物体运动速度变化快慢的物理量,以m/s2为单位。在静止时,加速度返回的值为地表静止物体的重力加速度,约为9.8m/s2。加速度传感器输出的信息存放在 SensorEvent的values数组中,此时的values数组会有三个值,分别代表手机在x轴,y轴,z轴方向上的加速度信息。
    根据力学原理,我们知道重力的作用永远是向下的,所以当手机竖直时,重力作用在y轴,平放在z轴,横立则在x轴。根据输出的值和手机的空间坐标以及重力的作用原理就可以判断手机放置的状态,比如,当x轴的值接近重力加速度或者接近负的重力加速度,说明设备处于横立状态,同时值为正时左边朝下,值为负时右边朝下。
    如果要开发一个“摇一摇”应用,根据静止时的加速度约为9.8m/2 以及摇动时的加速度会发生变化,我们可以设置一个加速度的上限,比如说20m/m2,当达到这个上限时就认为手机进行了摇动。了解了其中的原理之后,开发这个应用很简单,只需要修改前面模版中的传感器类型为加速度传感器,即

    sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    然后修改
    @Override
    public void onSensorChanged(SensorEvent event){
    float x = event.values[0];
    float y = event.values[0];
    float z = event.values[0];
    if(x>20 || y>20 || z>20){
    Toast.makeText(this,”欢迎使用摇一摇”,Toast.LENGTH_LONG).show();
    }
    }

    源码:

    package com.sdutacm.sensor;
    
    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity implements SensorEventListener{
    
        private SensorManager sensorManager;
    
        private Sensor sensor;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            getSensorManager();
        }
    
    
        @Override
        public void onSensorChanged(SensorEvent event) {
            //Sensor 发生变化时,在次通过event.values获取数据
            float x = event.values[0];
            float y = event.values[0];
            float z = event.values[0];
            if(x>20 || y>20 || z>20){
                Toast.makeText(this,"欢迎使用摇一摇",Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
        }
    
        public void getSensorManager() {
            sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            /**
             * 传入的参数决定传感器的类型
             * Senor.TYPE_ACCELEROMETER: 加速度传感器
             * Senor.TYPE_LIGHT:光照传感器
             * Senor.TYPE_GRAVITY:重力传感器
             * SenorManager.getOrientation(); //方向传感器
             */
            sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            if(sensorManager != null){
                //一般在Resume方法中注册
                /**
                 * 第三个参数决定传感器信息更新速度
                 * SensorManager.SENSOR_DELAY_NORMAL:一般
                 * SENSOR_DELAY_FASTEST:最快
                 * SENSOR_DELAY_GAME:比较快,适合游戏
                 * SENSOR_DELAY_UI:慢
                 */
                sensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_NORMAL);
            }
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            if(sensorManager != null){
                //解除注册
                sensorManager.unregisterListener(this,sensor);
            }
        }
    
    }
    
  • 相关阅读:
    BZOJ2512 : Groc
    BZOJ3644 : 陶陶的旅行计划
    BZOJ1439 : YY的问题
    BZOJ2872 : 优莱卡
    BZOJ3273 : liars
    BZOJ4133 : Answer的排队
    URAL Palindromic Contest
    ZOJ Monthly, January 2018
    BZOJ2689 : 堡垒
    2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11781873.html
Copyright © 2020-2023  润新知