新型的手机现在都加入了三维规则加速器(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开发中学到的一些心得.
本帖例子源码在附件里.
5 楼 java.lang.Object 2009-09-10
lordhong 写道
Hawy 写道
part 2呢?
还没出么?还是我没找到?
thanks
现在正在为这个精确控制苦恼
还没出么?还是我没找到?
thanks
现在正在为这个精确控制苦恼
由于帖子未到达预期的良好/精华贴目标... part 2暂时搁置了... -_____-
hong兄真是个人才
6 楼 lobbychmd 2009-09-10
掌声不够,请大家热烈鼓掌。。。
7 楼 wayfarer 2009-09-10
我发现,手势这个东西真的是个很吸引人的地方。
8 楼 Hawy 2009-09-10
lordhong 写道
Hawy 写道
part 2呢?
还没出么?还是我没找到?
thanks
现在正在为这个精确控制苦恼
还没出么?还是我没找到?
thanks
现在正在为这个精确控制苦恼
由于帖子未到达预期的良好/精华贴目标... part 2暂时搁置了... -_____-
看来需要大家一起顶起来............
9 楼 schedo 2009-10-13
hong老大,继续吧。
10 楼 lordhong 2009-10-14
schedo 写道
hong老大,继续吧。
好... 先忙完手头这个iphone app先...
11 楼 Puras 2009-10-14
我来给加到良好。。。
继续为大家奉献佳作吧。
另:问个入门级的问题:
在网上看,Android浏览器似乎只支持了HTML5里面的Canvas不知道对其他的新标签是否支持,
比如说音视频标签(Video和Audio)
继续为大家奉献佳作吧。
另:问个入门级的问题:
在网上看,Android浏览器似乎只支持了HTML5里面的Canvas不知道对其他的新标签是否支持,
比如说音视频标签(Video和Audio)
12 楼 lordhong 2009-10-14
Puras 写道
我来给加到良好。。。
继续为大家奉献佳作吧。
另:问个入门级的问题:
在网上看,Android浏览器似乎只支持了HTML5里面的Canvas不知道对其他的新标签是否支持,
比如说音视频标签(Video和Audio)
继续为大家奉献佳作吧。
另:问个入门级的问题:
在网上看,Android浏览器似乎只支持了HTML5里面的Canvas不知道对其他的新标签是否支持,
比如说音视频标签(Video和Audio)
多谢!
目前canvas的支持还很弱, audio/video还貌似没有
13 楼 Puras 2009-10-15
lordhong 写道
Puras 写道
我来给加到良好。。。
继续为大家奉献佳作吧。
另:问个入门级的问题:
在网上看,Android浏览器似乎只支持了HTML5里面的Canvas不知道对其他的新标签是否支持,
比如说音视频标签(Video和Audio)
继续为大家奉献佳作吧。
另:问个入门级的问题:
在网上看,Android浏览器似乎只支持了HTML5里面的Canvas不知道对其他的新标签是否支持,
比如说音视频标签(Video和Audio)
多谢!
目前canvas的支持还很弱, audio/video还貌似没有
完蛋了。
那对Flash的支持呢?
能否在HTML中嵌入音视频,之后使用Android的浏览器,或通过WebView来进行浏览?
14 楼 lordhong 2009-10-15
目前没有Flash, 明年就有了
15 楼 joyband 2009-10-16
hong真是个人才,多才多艺啊,PFPF,其实早就PF过了
16 楼 lordhong 2009-10-16
joyband 写道
hong真是个人才,多才多艺啊,PFPF,其实早就PF过了
没有捷径, 只有不停学习, 才能进步. 大家互勉之!
17 楼 kuangrenyishi 2010-02-04
hong哥,关注你的part2啊~ 最近一直在研究shake 但是的确有一些乱啊 不知道该如何入手啊
18 楼 lordhong 2010-02-05
kuangrenyishi 写道
hong哥,关注你的part2啊~ 最近一直在研究shake 但是的确有一些乱啊 不知道该如何入手啊
part2难产鸟~~~ 最近太忙了~~~
19 楼 wafj1984 2010-02-10
这个是谁发现的???手机公司很多用的都是TAT去做UI效果的,android也是一样的
20 楼 puhao7117441 2010-02-10
特别咨询,我模拟器怎么才能摇起来呢……不知道抱着显示器摇晃行不行,哈哈……
21 楼 lordhong 2010-02-11
puhao7117441 写道
特别咨询,我模拟器怎么才能摇起来呢……不知道抱着显示器摇晃行不行,哈哈……
第一次不行的话, 请多摇几次, 人品好的就会成功...
22 楼 geminiyellow 2010-02-11
lordhong 写道
puhao7117441 写道
特别咨询,我模拟器怎么才能摇起来呢……不知道抱着显示器摇晃行不行,哈哈……
第一次不行的话, 请多摇几次, 人品好的就会成功...
美果果,现在入手Gphone的话,有什么推荐么?
23 楼 lordhong 2010-02-12
现在是Droid/Milestone
24 楼 geminiyellow 2010-02-12
……那两个,太贵了。过一年要换舍不得。