Android开发Android进阶之旅程序员

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

2017-08-24  本文已影响488人  Kevin是只兔子

最近用知乎的时候,偶然间发现摇一摇可以反馈问题,就想着做一个类似的功能,顺便梳理下关于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不会自动关闭的,这就会导致你的电池几个小时就会将电耗尽。例子里有一个

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

上一篇 下一篇

猜你喜欢

热点阅读