android学习笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1,android手势开发识别Gestrue开发
(/tsdl2009/archive/2010/08/13/5810922.aspx)
经过了一段Android的学习,基本上了解了Android的基础知识。今天,我们来研究一下Android中特有的手势识别技术,即Gesture。首先,我从网上找了很多资料,具体归纳起来有2类:一类是触摸屏手势识别,另一类是输入法手势识别。
我们先来讨论一下第一类触摸屏手势识别,这个比较简单,就是利用触摸屏的Fling、Scroll等Gesture(手势)来操作屏幕,比如用Scroll手势在浏览器中滚屏,用Fling在阅读器中翻页等。在Android系统中,手势的识别是通过GestureDetector.OnGestureListener接口来实现的。下面通过我自己的一个动手实验来进行介绍。
首先,我们在Eclipse中创建一个工程,名称叫SignFilpDemo。然后,在src 中创建一个SignFilpDemo源文件。这个工程是基于Android1.6的。因为,在Android 1.6之前的版本中,需要开发者编写大量的代码才能实现某些更为复杂的Gestures功能。而在之后的版本SDk中嵌入标准的Gestures API库(Package: android.gesture),包括了所有与Gesture技术相关的操作:存储、加载、创建新Gestures和识别等。其工程结构如下:
图1
接着,我们知道Android的事件处理机制是基于Listener(监听器)来实现的,比如我们今天所说的触摸屏相关的事件,就是通过onTouchListener。因此,我们在源代码中要实现这个接口。另外,我们还要实现OnGestureListener接口,因为,那个手势的识别是通过GestureDetector.OnGestureListener接口来实现的。其中,onTouchEvent方法则是实现了OnTouchListener中的抽象方法,我们只要在这里添加逻辑代码即可在用户触摸屏幕时做出响应。在这里我们调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector 来分析是否有合适的callback函数来处理用户的手势。接下来,就是实现了以下6个抽象方法,其中最有用的当然是onFling()、onScroll()和onLongPress()了。下面介绍一下:
(1)用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发,其源代码如下:
public boolean onDown(MotionEvent e) {
return false;
}
public void onShowPress(MotionEvent e) {
}
(2)用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP 触发,其源代码如下:
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
(3)用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
// 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
public void onLongPress(MotionEvent e) {
}
// 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {
return false;
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
return false;
}
我们今天来做一个onFling()事件的处理吧,这里需要注意的是
Fling事件的处理代码中,除了第一个触发Fling的
ACTION_DOWN和最后一个ACTION_MOVE中包含的坐标等信息外,
我们还可以根据用户在X轴或者Y轴上的移动速度作为条件。在这
个例子中,我们是根据用户在屏幕上移动的x轴坐标或者是y轴坐
标位移来判断方向。如果x轴坐标位移大于50向左,小于-50向
右,如果y轴坐标位移大于50向上,小于-50向下。源代码如下:
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getX() - e2.getX() > 50) {
Toast.makeText(SignFlipDemo.this, "左",
Toast.LENGTH_LONG).show();
return true;
} else if (e1.getX() - e2.getX() < -50) {
Toast.makeText(SignFlipDemo.this, "右", Toast.LENGTH_LONG).show();
return true;
} else if (e1.getY() - e2.getY() > 50) {
Toast.makeText(SignFlipDemo.this, "上", Toast.LENGTH_LONG).show();
return true;
} else if (e1.getY() - e2.getY() < -50) {
Toast.makeText(SignFlipDemo.this, "下", Toast.LENGTH_LONG).show();
return true;
}
return false;
}
如果鼠标向上移动,运行效果如下图2所示: