版权声明:本文为博主原创文章,未经博主允许不得转载。 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
结束语
希望上面的手势体感的翻转算法能给你的开发带来帮助!
感恩开源,支持开源,以前经常索取,现在我也要分享自己的代码。