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

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


熊猫烧香

祭拜的动作,首先是把手机倾斜大概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
几年前刚学安卓的时候做的啦,主要是创意效果吧。

魔术卡牌

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容