您的位置:首页 > 其它

手势体感-翻转算法的实现(原创)

2016-03-09 23:50 260 查看

引子

印度客户的一个需求,希望实现来电时翻转静音的功能。具体如下:

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);


2. 接下来完成一个好习惯,在程序的onPause()或者onDestory()进行注销ACC传感器的使用,因为如果忘了会导致用户无意和无形中过多损失的电量。步骤如下:

if (mSensorManager != null) {
mSensorManager.unregisterListener(mSensorListener);


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;
}
}


5.铃声静音的功能代码块

private void silent(){
TelecomManager tm;
tm = (TelecomManager).getSystemService.
(Context.TELECOM_SERVICE);
if (tm != null && tm.isRinging()) {
tm .silenceRinger();
}
}


结束语

希望上面的手势体感的翻转算法能给你的开发带来帮助!

感恩开源,支持开源,以前经常索取,现在我也要分享自己的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: