zoukankan      html  css  js  c++  java
  • Android调用传感器和震动

    介绍Sensor类

    SDK只有一句介绍“Class representing a sensor. Use getSensorList(int) to get the list of available Sensors.”,表示一个感应器的类,可以使用getSensorList方法(此方法属于接下来要讲的SensorManager)获得所有可用的感应器,该方法返回的是一个List
    下面的列表显示了,Sensor所提供的所有服务
    Constants
    int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type.
    //三轴加速度感应器 返回三个坐标轴的加速度 单位m/s2
    int TYPE_ALL A constant describing all sensor types.
    //用于列出所有感应器
    int TYPE_GRAVITY A constant describing a gravity sensor type.
    //重力感应器
    int TYPE_GYROSCOPE A constant describing a gyroscope sensor type
    //陀螺仪 可判断方向 返回三个坐标轴上的角度
    int TYPE_LIGHT A constant describing an light sensor type.
    //光线感应器 单位 lux 勒克斯
    int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type.
    //线性加速度
    int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type.
    //磁场感应 返回三个坐标轴的数值 微特斯拉
    int TYPE_ORIENTATION This constant is deprecated. use SensorManager.getOrientation() instead.
    //方向感应器 已过时 可以使用方法获得
    int TYPE_PRESSURE A constant describing a pressure sensor type
    //压力感应器 单位 千帕斯卡
    int TYPE_PROXIMITY A constant describing an proximity sensor type.
    //距离传感器
    int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type.
    //翻转传感器
    int TYPE_TEMPERATURE A constant describing a temperature sensor type
    //温度传感器 单位 摄氏度
    此类中包含的方法都是get型的 用来获取所选sensor的一些属性,sensor类一般不需要new而是通过SensorManager的方法获得

    加速度感应器

    可以通过这个感应器获得三个浮点型
    x-axis
    y-axis
    z-axis
    这里写图片描述

    X Y Z分别对应values[0]到[2]
    X表示左右移动的加速度
    Y表示前后移动的加速度
    Z表示垂直方向的加速度 (测试时发现,将手机置于水平桌面稳定后 XY均为0 Z的值为9.4 约等于重力加速度,依次可以做一个简单的算法实现重力测力计。)

    //申请震动权限
    <uses-permission android:name="android.permission.VIBRATE"/>
    
    package com.zingon.ztc.gpstry;
    
    import android.content.Context;
    import android.hardware.SensorManager;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.os.Vibrator;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        TextView inf;
        //感应器管理器,所有感应器都可以通过它获得
        SensorManager sm;
        //震动
        Vibrator vb;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            inf=(TextView)findViewById(R.id.inf);
            //获得系统服务
            sm= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            vb= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            new SensorTry(sm,inf,vb).run();
        }
    }
    package com.zingon.ztc.gpstry;
    
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Vibrator;
    import android.util.Log;
    import android.widget.TextView;
    
    /**
     * Created by ztc on 16-3-9.
     */
    public class SensorTry extends Thread{
        SensorManager sm;
        String TAG = "sensor";
        TextView inf;
        Vibrator vb;
        float x,y,z;
        public SensorTry(SensorManager sm,TextView inf,Vibrator vb){
            this.sm=sm;
            this.inf=inf;
            this.vb=vb;
        }
    
        @Override
        public void run() {
        //获得加速度传感器
            Sensor sensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            //注册监听器
            sm.registerListener(myListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
        //监听器
        SensorEventListener myListener=new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
    
                    //图解中已经解释三个值的含义
                    //当值变化超过 1 时,震动
                    if(Math.abs(x-event.values[0])>=1||Math.abs(y-event.values[1])>=1||Math.abs(z-event.values[2])>=1) {
                        x = event.values[0];
                        y = event.values[1];
                        z = event.values[2];
                        Log.i(TAG,"onSensorChanged");
                        Log.i(TAG, "
     heading " + x);
                        Log.i(TAG, "
     pitch " + y);
                        Log.i(TAG, "
     roll " + z);
                        inf.setText("设备重力传感器
    
    X:");
                        inf.append(String.valueOf((int) x));
                        inf.append("
    Y:");
                        inf.append(String.valueOf((int) y));
                        inf.append("
    Z:");
                        inf.append(String.valueOf((int) z));
                        // 停止 开启 停止 开启
                        long[] pattern = {100, 400, 100, 400};
                        vb.vibrate(pattern, -1);
                    }
                }
    
            }
    
            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
                Log.i(TAG, "onAccuracyChanged");
            }
        };
    }

    效果

    手机移动,就会震动
    
  • 相关阅读:
    深析Tomcat容器工作流程
    GC基础
    oracle sql总结
    mybatis返回值类型总结
    eclipse启动javaweb项目后,如何让局域网内的其他人访问
    oracle sql 逗号 分割 REGEXP_SUBSTR 函数
    Oracle12c安装时报"指定的oracle主目录用户已存在"错误
    spring
    Oracle sql where后面的多条件case when判断执行
    Oracle12c安装时报ins-30131
  • 原文地址:https://www.cnblogs.com/A-yes/p/9894201.html
Copyright © 2011-2022 走看看