美文网首页
利用传感器监测手机祭拜的摆动动作

利用传感器监测手机祭拜的摆动动作

作者: 在寻找雪见的景天 | 来源:发表于2017-09-27 21:47 被阅读69次

    最近突然有个想法,就是用安卓的加速度传感器来监测手机的移动状态,从而让手机完成我们想要的移动轨迹,完成后解锁某个功能啥的。就比如我想让用户把手机当成是香(祭拜用的高香),然后模仿祭拜的动作,拜三下。例如下面这图,把香换成手机。


    熊猫烧香

    祭拜的动作,首先是把手机倾斜大概30°,然后慢慢提高手机角度,最终让手机竖着起来,然后又慢慢的把手机摆回30°的样子。就这完成了一次的祭拜动作。那如何用手机来监测,用户是不是按照这样的动作来摆动了呢?那就用上手机的加速度传感器。

    加速度传感器

    加速度方向

    这里的加速度特指重力加速度,所以在静止时重力传感器的返回值与加速度传感器值相同。
    地表上静止物体的重力加速度约为9.8 m/s^2。所以,当我们把手机正面朝上放在桌子上的时候,z的值应该是接近于9.8,而x和y的值则是接近0。
    也可以这样理解:
    1、当x轴的值接近重力加速度时,说明设备的左边朝下。
    2、当x轴的值接近负的g值时,说明设备的右边朝下。
    3、当y轴的值接近g值时,说明设备的下边超下(与上图一样)。
    4、当y轴的值接近负的g值时,说明设备的上边朝下(倒置)。
    5、当z轴的值接近g值时,说明设备的屏幕朝上。
    6、当z轴的值接近负的g值时,说明设备屏幕朝下。

    明白原理后,我们看代码,怎么使用加速度传感器:
    第一步是注册:

     mSensorManager = ((SensorManager) getSystemService(SENSOR_SERVICE));
            if (mSensorManager != null) {
                //获取加速度传感器
                Sensor mAccelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                if (mAccelerometerSensor != null) {
                    mSensorManager.registerListener(sensorEven, mAccelerometerSensor, SensorManager.SENSOR_DELAY_UI);
                }
            }
    

    第二部是设置监听:

        float a = 3;//一开始倾斜手机30°,z轴的值大概是3
        int times = 0;//祭拜的次数
        boolean isStart = true;//是否已恢复过初始状态
        boolean isFinish = false;//是否祭拜完成
    
        private SensorEventListener sensorEven = new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                int type = event.sensor.getType();
                if (type == Sensor.TYPE_ACCELEROMETER) {
                    //获取三个方向值
                    float[] values = event.values;
                    float x = values[0];
                    float y = values[1];
                    float z = values[2];
    
                    Log.i("===", x + "  " + y + "  " + z);
    
                    if (!isFinish) {
                        if (y > a) {
                            a = y;
                        } else {
                            a = 3;
                        }
                        if (y < 3) {
                            isStart = true;
                        }
                        if (a > 9 && isStart) {
                            isStart = false;
                            a = 3;
                            times++;
                            Log.i("=====", times + "次拜");
                        }
                        if (times == 3) {
                            isFinish = true;
                            Log.i("=====", "祭拜完成");
                        }
                    }
    
    
                    //摇一摇
                    if ((Math.abs(x) > 17 || Math.abs(y) > 17 || Math.abs(z) > 17) && !isOpen) {
                        isOpen = true;
                        //做摇一摇后的操作
                    }
                }
            }
    
            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
            }
        };
    

    最后别忘了销毁:

      @Override
        protected void onDestroy() {
            super.onDestroy();
            if (mSensorManager != null) {
                mSensorManager.unregisterListener(sensorEven);
            }
        }
    

    经过上面的判断,应该是可以监测到手机祭拜的动作了。那除了这些,还有很多好玩的,例如摇一摇啊,看谁摇晃的次数多啊,都是看你的创意了。之前还用红外传感器(就是听筒旁边的传感器)来监测,首先手机上显示是牌面朝下的扑克牌,当我们用手掌在听筒经过,就做翻牌的操作,这样就好像是一个魔术啦。APP下载地址:http://app.mi.com/details?id=com.game.magic&ref=search
    几年前刚学安卓的时候做的啦,主要是创意效果吧。

    魔术卡牌

    相关文章

      网友评论

          本文标题:利用传感器监测手机祭拜的摆动动作

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