新型的手机现在都加入了三维规则加速器(accelerometer), 所以手势/动作的检测也逐渐成为移动应用开发的一部分. 比如想擦掉一副画好的画, 可以轻微摇一摇你的手机, 就可以擦掉canvas里的graphics了. 第一次看见这个是07年在越狱了的iPhone上面一个叫SketchUp的软件. 还有就是todo list, 完成了的项目, 轻轻摇摇就自动删除了.
如何检测shake动作其实有好多种approach, 一个是ClingMarks写的一个博客提到过. 基本上就是把x,y,z三个
轴上的距离变化统统加起来, 然后除以间隔的时间, 得出一个速度, 然后如果这个速度是大于某一个值的话, 就是shake动作了. 我个人认为这个公式有偏差, 在某些情况下一些非shake的动作也会被检测成shake. 而且你并不知道是在哪个方向产生了这个shake动作. 所以我叫这种模式coarse-grain, 很粗糙. 但如果你并不关心shake的一些具体细节, 只是想知道是不是shake动作而已, 这个应该已经足够了.
在你的Activity里, 你要implement这个SensorListener:
public class ShakeActivity extends Activity implements SensorListener
然后你需要获取一个SensorManager:
sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
然后注册自己这个感应器需要所获得的数据的flags:
ensorMgr.registerListener(this,SensorManager.SENSOR_ACCELEROMETER,SensorManager.SENSOR_DELAY_GAME);
在你的onSensorChange()方法中, 你有这个粗糙公式来确定shake动作:
public void onSensorChanged(int sensor, float[] values) {
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
// 每100毫秒检测一次
if ((curTime - lastUpdate) > 100) {
long diffTime = (curTime - lastUpdate);
lastUpdate = curTime;
x = values[SensorManager.DATA_X];
y = values[SensorManager.DATA_Y];
z = values[SensorManager.DATA_Z];
float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;
if (speed > SHAKE_THRESHOLD) {
Log.d(”sensor”, “shake detected w/ speed: ” + speed);
Toast.makeText(this, “shake detected w/ speed: ” + speed, Toast.LENGTH_SHORT).show();
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
这个shake的速度临界点值定义为:
private static final int SHAKE_THRESHOLD = 800;
这个实现其实是很简单的. 在我的下篇帖子中我会介绍比较细腻的检测方法, 也是我在iPhone开发中学到的一些心得.
本帖例子源码在附件里.
分享到:
相关推荐
android-shake-detector 检测设备的晃动
ShakeTheBox 提供了用于处理图像的 C++ 代码,以便获得在流中播种的粒子轨迹。通常至少需要摄像机来重建 3D 轨迹 有关如何使用此代码的说明如下: (1) 预处理图像,使粒子更亮,图像噪点更少。处理图像的示例代码...
因为react-native-shake-event不再处于活动开发中,所以我决定创建它。 请注意,它仅适用于真实设备 安装 npm install react-native-shake 或者 yarn add react-native-shake 链接本机模块 自动的: react-native...
本文介绍的Shake-Shake方法旨在帮助深度学习从业者面临过度拟合问题。 这个想法是在多分支机构中取代网络,具有随机仿射的并行分支的标准求和组合。 适用于3分支残差网络,摇动正则化改善了CIFAR-10和CIFAR-测试错误...
Redis-shake是一个基于golang语言开发的,用于在两个redis之间同步数据的工具,满足用户非常灵活的同步、迁移需求。
资源来自pypi官网。 资源全名:Shake-Images-0.4.tar.gz
阿里云Redis&MongoDB团队开源的用于redis数据同步的工具 注意:v3 版本仍处于测试阶段,有些功能不支持或不兼容 v2 版本。如果您在使用 v3 版本时遇到问题,请返回 v2 版本
资源分类:Python库 所属语言:Python 资源全名:Shake-Auth-1.3.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:Shake-Files-1.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具。redis-shake是我们基于redis-port基础上进行改进的一款产品。它支持解析、恢复、备份、同步四个功能。 源码地址: ...
<!--导入CSS样式--> <!--使用如下--> <div class="shake">shake <div class="shake shake-hard">shake-hard <div class="shake shake-slow">shake-slow ... <div class="shake shake-crazy">shake-crazy</div>
Android View Controller An Android library for cycling through views using animations in a list. The library also provides animations as built in animations that can be used: A right flip ...
蒙哥·沙克(Mongo-Shake) Mongo-Shake由Nosql Team在阿里云中开发和维护。 Mongo-Shake是基于MongoDB的oplog的通用服务平台。 它从源mongo数据库获取oplog,然后在目标mongo数据库中重播或发送到不同隧道中的其他...
shake-and-share
maven { url 'https://jitpack.io' } }}添加依赖项implementation 'com.github.Lucem-Anb:shake-detector:0.0.1'用法在需要的地方创建一个新的震动检测器new ShakeDetector(this, new ShakeListener() { @...
SHAKE
Android快速SDK(16)摇一摇Shake【傻瓜模式】
Android仿Iphone抖动效果Shake Icon.zip
Unit8Howdo-you-make-a-banana-milk-shake-微课.pptx
国外的地震有限元程序,美国伯克利大学的,非常经典