Gesture手势及手势库
一、Gesture基础:
(一)、概念:
所谓手势,其实是指用户手指或者触摸笔在触摸屏上的连续触碰行为。比如在屏幕上从左至右划出一个动作,就是手势。再比如在屏幕上画一个圆圈也是手势。手势这种连续的触碰会形成某个方向上的移动趋势,也会形成一个不规则的几何图形。
应用程序中的手势就是:多个持续的触摸事件在屏幕上形成特定的形状。
Android对两种手势行为都提供了支持:
- 对于第一种手势行为而言,Android提供了手势检测,并为手势检测提供了相应的监听器;
- 对于第二种手势行为,Android允许开发者添加手势,并提供了相应的API识别用户手势。
(二)、原理:
对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理。
为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供了手势识别工具
GestureDetector。 GestureDetector的工作原理是,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手势。
二、手势检测:
(一)、
操作步骤:
1、在View中实例化
GestureDetector,一个GestureDetector实例代表一个
手势检测器;
2、构建GestureDetector时需要一个参数GestureDetector.
OnGestureListener。OnGestureListener是一个监听器,负责对用户的手势行为提供相应。
3、重写该View的
onToutchEvent()方法,返回
detector.onToutchEvent(event).
(二)、OnGestureListener里包含的事件处理方法:
1、abstract boolean
onDown(MotionEvent e);
// 单击,触摸屏按下时立刻触发
2、abstract boolean
onSingleTapUp(MotionEvent e);
// 用户在触摸屏上
轻击并抬起,手指离开触摸屏时触发(而长按、滚动、滑动时,不会触发这个手势)
3、abstract void
onShowPress(MotionEvent e);
// 重压,触摸屏按下后片刻后
抬起,会触发这个手势,如果迅速抬起则不会
4、abstract void
onLongPress(MotionEvent e);
// 长按,触摸屏按下后既
不抬起也不移动,过一段时间后触发
5、abstract boolean
onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);
// 滚动,触摸屏
按下后移动
6、abstract boolean
onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);
// 滑动,触摸屏按下后
快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势
(三)、实例代码:
1、手势检测核心代码:
public class
MainActivity
extends
Activity {
private final static
String
TAG
=
"MainActivity"
;
private
GestureDetector
detector
;
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main
);
detector
=
new
GestureDetector(
this
,
new
OnGestureListener() {
@Override
publicboolean
onSingleTapUp(MotionEvent e) {
Log.
i
(
TAG
,
"==onSingleTapUp"
+ e.getAction());
returnfalse
;
}
@Override
public void
onShowPress(MotionEvent e) {
Log.
i
(
TAG
,
"==onShowPress"
+ e.getAction());
}
@Override
public boolean
onScroll(MotionEvent e1, MotionEvent e2,
float
distanceX,
float
distanceY) {
Log.
i
(
TAG
,
"==onScroll"
+ e1.getAction() +
":"
+ e2.getAction());
returnfalse
;
}
@Override
public void
onLongPress(MotionEvent e) {
Log.
i
(
TAG
,
"==onLongPress"
+ e.getAction());
}
@Override
public boolean
onFling(MotionEvent e1, MotionEvent e2,
float
velocityX,
float
velocityY) {
Log.
i
(
TAG
,
"==onFling"
+ e1.getAction() +
":"
+ e2.getAction());
returnfalse
;
}
@Override
publicboolean
onDown(MotionEvent e) {
Log.
i
(
TAG
,
"==onDown"
+ e.getAction());
returnfalse
;
}
});
}
@Override
publicboolean
onTouchEvent(MotionEvent event) {
return
detector
.onTouchEvent(event);
}
}
2、通过手势缩放图片核心代码:
publicclass
MainActivity
extends
Activity {
private
GestureDetector
detector
;
private
ImageView