美文网首页Android开发Android进阶之旅程序员
Android 传感器开发(仿知乎摇一摇反馈问题功能)

Android 传感器开发(仿知乎摇一摇反馈问题功能)

作者: Kevin是只兔子 | 来源:发表于2017-08-24 18:48 被阅读488次

    最近用知乎的时候,偶然间发现摇一摇可以反馈问题,就想着做一个类似的功能,顺便梳理下关于sensor的知识。
    先看看做出来的效果:

    sample.gif

    传感器中比较重要的几个类:
    android.hardware.Sensor;
    android.hardware.SensorEvent
    android.hardware.SensorEventListener
    okay,会这几个类就够用了,再记住一个回调方法,就能对付大多数的需求了

       @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
        }
    
        @Override
        public void onSensorChanged(SensorEvent event) {
         
        }
    

    下面让我回顾下传感器的知识:

    Android 中传感器有很多,当你打出[Sensor.]的时候就会看到下面这样

    image.png

    下面还有好多,如果想详细研究下所有传感器可以看看这里 直达链接

    Android的三大类传感器

    动作(Motion)传感器、环境(Environmental)传感器、位置(Position)传感器

    1.动作传感器

    加速(accelerometer)传感器、重力(gravity)传感器、陀螺仪(gyroscope)传感器、旋转向量(rotational vector )传感器
    

    我们摇一摇功能主要用的就是动作传感器中的加速传感器,动作传感器里有一个很吊的图,只要动作传感器肯定涉及到坐标,下图形象的说明了这个坐标系。


    在加速传感器中:实现我上方说的那个回调

     @Override
        public void onSensorChanged(SensorEvent event) {
             float[] values = event.values;
        }
    

    其中这三个值就代表着X,Y,Z方向的值
    values[0]: Acceleration minus Gx on the x-axis
    values[1]: Acceleration minus Gy on the y-axis
    values[2]: Acceleration minus Gz on the z-axis

    2.环境传感器

    湿度(barometer)传感器、光线(photometer)传感器、温度(thermometer)传感器
    

    3.位置传感器

    方向(orientation)传感器、磁力(magnetometer)传感器
    

    如何实现摇一摇反馈功能

    1.显示出手机中所有的传感器

    先获取SensorManager对象

    SensorManager sensorManager = (SensorManager).getSystemService(SENSOR_SERVICE);
    

    列出来所有的传感器

     List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
    

    为了实现摇一摇功能,我写了一个叫shakeUtils工具类并且实现了SensorEventListener,这样我就需要实现下面两个方法

         /**
         * 传感器精度变化时回调
         */
     @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
        }
         /**
         * 传感器数据变化时回调
         */
        @Override
        public void onSensorChanged(SensorEvent event) {
            int sensorType = event.sensor.getType();
            float[] values = event.values;
            if (sensorType == Sensor.TYPE_ACCELEROMETER) {
                //这里可以调节摇一摇的灵敏度
                if ((Math.abs(values[0]) > 12 || Math.abs(values[1]) > 12 || Math.abs(values[2]) > 12)) {
                    System.out.println("sensor value == " + " " + values[0] + " " + values[1] + " " + values[2]);
                    if (null != mOnShakeListener) {
                        mOnShakeListener.onShake();
                    }
                }
            }
    
            if (sensorType == Sensor.TYPE_AMBIENT_TEMPERATURE) {
                //todo
            }
        }
    

    在主函数里主要这样调用shakeUtils就行了:

     shakeUtils = new ShakeUtils(this);
            shakeUtils.setOnShakeListener(new ShakeUtils.OnShakeListener() {
                @Override
                public void onShake() {
                    Toast.makeText(MainActivity.this, "摇了摇", Toast.LENGTH_SHORT).show();
                    confirmDialog.setOnConfirmListener(new ConfirmDialog.OnConfirmClickListener() {
                        @Override
                        public void onFeedBack() {
                            gotoFeedBackActivity();
                        }
    
                        @Override
                        public void onScreenShot() {
                            saveScreenShoot(rootView);
    
                        }
                    });
                    confirmDialog.show();
    
                }
            });
        }
    

    有一点需要注意一下,我们SensorManager让我们能拿到设备的sensors,但是当你不用sensors的时候,当你的activity处于pause的时候,sensor不会自动关闭的,这就会导致你的电池几个小时就会将电耗尽。例子里有一个

    最后还是附上源码,有需要的朋友可以拿去用,直达链接。开源让我们不断进步。

    相关文章

      网友评论

        本文标题:Android 传感器开发(仿知乎摇一摇反馈问题功能)

        本文链接:https://www.haomeiwen.com/subject/lidjdxtx.html