昭阳区苏家院派出所:如何在android中实现shake的动作检测

来源:百度文库 编辑:中财网 时间:2024/05/03 00:46:39
新型的手机现在都加入了三维规则加速器(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:

Java代码  
  1. public class ShakeActivity extends Activity implements SensorListener  


然后你需要获取一个SensorManager:
Java代码  
  1. sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);  


然后注册自己这个感应器需要所获得的数据的flags:
Java代码  
  1. ensorMgr.registerListener(this,SensorManager.SENSOR_ACCELEROMETER,SensorManager.SENSOR_DELAY_GAME);  


在你的onSensorChange()方法中, 你有这个粗糙公式来确定shake动作:

Java代码  
  1. public void onSensorChanged(int sensor, float[] values) {  
  2. if (sensor == SensorManager.SENSOR_ACCELEROMETER) {  
  3. long curTime = System.currentTimeMillis();  
  4. // 每100毫秒检测一次  
  5. if ((curTime - lastUpdate) > 100) {  
  6. long diffTime = (curTime - lastUpdate);  
  7. lastUpdate = curTime;  
  8.   
  9. x = values[SensorManager.DATA_X];  
  10. y = values[SensorManager.DATA_Y];  
  11. z = values[SensorManager.DATA_Z];  
  12.   
  13. float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;  
  14.   
  15. if (speed > SHAKE_THRESHOLD) {  
  16. Log.d(”sensor”, “shake detected w/ speed: ” + speed);  
  17. Toast.makeText(this, “shake detected w/ speed: ” + speed, Toast.LENGTH_SHORT).show();  
  18. }  
  19. last_x = x;  
  20. last_y = y;  
  21. last_z = z;  
  22. }  
  23. }  
  24. }  


这个shake的速度临界点值定义为:
Java代码  
  1. private static final int SHAKE_THRESHOLD = 800;  


这个实现其实是很简单的.  在我的下篇帖子中我会介绍比较细腻的检测方法, 也是我在iPhone开发中学到的一些心得.

本帖例子源码在附件里.
  • ShakeSample.zip (29.9 KB)
  • 下载次数: 601
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。 推荐链接
  • 20-30万急聘多名天才Java/MTA软件工程师
  • 3G培训就业月薪平均7K+,不3K就业不花一分钱!
  • 见证又一个准百万富翁的诞生!
返回顶楼          
  • nihongye
  • 等级:
  • 性别:
  • 文章: 864
  • 积分: 1533
  • 来自: 深圳
   发表时间:2009-04-21   最后修改:2009-04-21 收藏 这个功能不错。可以拿着....来控制电脑鼠标,比如双击,就猛甩两次....,用...来控制鼠标轨迹就不在话下了。 返回顶楼           回帖地址 0 0 已投票
  • Goro
  • 等级: 初级会员
  • 性别:
  • 文章: 3
  • 积分: 30
  • 来自: 上海
   发表时间:2009-06-08   收藏 楼主,我很想知道
SensorManager.DATA_X
SensorManager.DATA_Y
SensorManager.DATA_Z

这个怎么看X, Y, Z的。

屏幕的宽是X?
长是Y?
垂直是Z?

而且貌似SDK1.5里,模拟器执行
(SensorManager)getSystemService(Context.SENSOR_SERVICE);
就会死。。 返回顶楼           回帖地址 0 0 已投票
  • Hawy
  • 等级: 初级会员
  • 性别:
  • 文章: 3
  • 积分: 30
  • 来自: 上海
   发表时间:2009-09-09   收藏 part 2呢?
还没出么?还是我没找到?
thanks
现在正在为这个精确控制苦恼 返回顶楼           回帖地址 0 0 已投票
  • lordhong
  • 等级:
  • 性别:
  • 文章: 4697
  • 积分: 2737
  • 来自: 在野
   发表时间:2009-09-10   收藏 Hawy 写道part 2呢?
还没出么?还是我没找到?
thanks
现在正在为这个精确控制苦恼

由于帖子未到达预期的良好/精华贴目标... part 2暂时搁置了... -_____- 返回顶楼           回帖地址 0 0 已投票
  • java.lang.Object
  • 等级:
  • 性别:
  • 文章: 211
  • 积分: 110
  • 来自: 鹭岛
   发表时间:2009-09-10   收藏 lordhong 写道Hawy 写道part 2呢?
还没出么?还是我没找到?
thanks
现在正在为这个精确控制苦恼

由于帖子未到达预期的良好/精华贴目标... part 2暂时搁置了... -_____-
hong兄真是个人才 返回顶楼           回帖地址 0 0 已投票
  • lobbychmd
  • 等级: 初级会员
  • 性别:
  • 文章: 275
  • 积分: 40
  • 来自: 广州
   发表时间:2009-09-10   收藏 掌声不够,请大家热烈鼓掌。。。 返回顶楼           回帖地址 0 0 已投票
  • wayfarer
  • 等级: 初级会员
  • 性别:
  • 文章: 21
  • 积分: 30
  • 来自: 上海
   发表时间:2009-09-10   收藏 我发现,手势这个东西真的是个很吸引人的地方。 返回顶楼           回帖地址 0 0 已投票
  • Hawy
  • 等级: 初级会员
  • 性别:
  • 文章: 3
  • 积分: 30
  • 来自: 上海
   发表时间:2009-09-10   收藏 lordhong 写道Hawy 写道part 2呢?
还没出么?还是我没找到?
thanks
现在正在为这个精确控制苦恼

由于帖子未到达预期的良好/精华贴目标... part 2暂时搁置了... -_____-
看来需要大家一起顶起来............ 返回顶楼           回帖地址 0 0 已投票
  • schedo
  • 等级: 初级会员
  • 性别:
  • 文章: 23
  • 积分: 90
  • 来自: 北京
   发表时间:2009-10-13   收藏 hong老大,继续吧。