手势识别 翻转算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WUWUWEIWEILONGLONG/article/details/78206442

引子

印度客户的一个需求,希望实现来电时翻转静音的功能。具体如下: 
1.电话铃声到来时; 
2.采取下面动作: 
a.手机正面翻到背面<顺时针或者逆时针旋转180度> 
b.手机背面翻到正面<顺时针或者逆时针旋转180度> 
3.来电静音,或者你喜欢的话,可以换成翻转闹铃静音;

技术点

1.数据来源:ACC传感器(即重力加速度传感器) 
2.翻转算法:根据翻转动作的三轴原始数据变化观察,找出规律完成算法;

本算法的价值

翻转的识别度 > 95%,欢迎直接复制使用,大家快乐分享代码呗。 
废话不多说了,直接上Android代码.

翻转算法实现步骤:

1.注册ACC传感器的使用权利,在程序的onResume()或者onCreate()找个地方,实现具体如下代码:
    SensorManager mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
    mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
  • 1
  • 2
2. 接下来完成一个好习惯,在程序的onPause()或者onDestory()进行注销ACC传感器的使用,因为如果忘了会导致用户无意和无形中过多损失的电量。步骤如下:
    if (mSensorManager != null) {
        mSensorManager.unregisterListener(mSensorListener);
  • 1
  • 2
3.在接下来实现SensorEventListener 接口,类似下面的:
 public class xxx implement SensorEventListener {  
4.上面步骤完成了,需要重新SensorEventListener 对应onSensorChanged的方法,下面直接贴代码了(本文的核心)
    private float curZ;
    private float preZ;
    private int count;
    private SensorManager mSensorManager;
    private static final int FLIP_MAX = 10; 

   @Override
   public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER){      
            return;
        }                                          
        curZ = event.values[SensorManager.DATA_Z];
        if (count++ % FLIP_MAX == 0) {
            Log.v(this, "Flip->current=" + curZ + " ,preZ = " + preZ);
            if ((curZ * preZ) < 0 
                  && (Math.abs(curZ - preZ) > FLIP_MAX)) {    
                  // 判定翻转动作生效
                 Log.v(this, "suhuazhi Flip->" + curZ + ",preZ" + preZ); 
                 silent();   
             }
          }
        preZ = curZ;
        count = 1;
      }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
5.铃声静音的功能代码块
    private void silent(){
        TelecomManager tm;
        tm = (TelecomManager).getSystemService.
            (Context.TELECOM_SERVICE);
        if (tm != null && tm.isRinging()) {
            tm .silenceRinger();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结束语

希望上面的手势体感的翻转算法能给你的开发带来帮助! 
感恩开源,支持开源,以前经常索取,现在我也要分享自己的代码。

猜你喜欢

转载自blog.csdn.net/WUWUWEIWEILONGLONG/article/details/78206442