前言
平时Android开发,关于手势的监听很常用,比如滑动监听,手势缩放(最常见的可缩放ImageView),那么今天就介绍下,怎么样监听View滑动操作。
实现思路
Android实现滑动监听,主要有2种方式:
1、通过GestureDetector实现
2、通过View的onTouchEvent手势回调实现
下面介绍下这两种方式是如何实现的。
通过GestureDetector实现
手势简介
GestureDetector是手势监听类,能够监听手指接触屏幕后的一系列动作:按下(onDown)、短按(onShowPress)、长按(onLongPress)、滑动(onFling)、单指抬起(onSingleTapUp)等;
ScaleGestureDetector是缩放手势监听类,能够监听多指缩放事件,用法与GestureDetector基本一致;
GestureDetector有两个监听接口,分别是OnGestureListener,OnDoubleTapListener,分别在构造函数中、setOnDoubleTapListener()设置,用于获取对应事件序列回调;
注意:长按手势需单独设置开启监听,才会回调对应事件方法:mGestureDetector.setIsLongpressEnabled(true),缩放手势一般只处理onScale()。
那么显而易见,实现View的滑动监听,肯定要通过GestureDetector.onFling实现,话不多说,直接上代码
public class GameView extends GridLayout {
GestureDetector mDetector;
private void initGameView() {
mDetector = new GestureDetector(MyApplication.getContext(), new OnGestureListener() {
static final float FLIP_DISTANCE = 500; // 某一方向上的滑动距离超过此值才是向此方向滑动
...
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float offsetX = e1.getX() - e2.getX();
float offsetY = e1.getY() - e2.getY();
if (Math.abs(offsetX) > Math.abs(offsetY)) {
// 横坐标方向的偏移值大于纵坐标方向的偏移值 左右滑动
if (offsetX < -FLIP_DISTANCE) {
Log.i(TAG, "向右");
} else {
Log.i(TAG, "向左");
}
} else {
// 横坐标方向的偏移值小于纵坐标方向的偏移值 上下滑动
if (offsetY < -FLIP_DISTANCE) {
Log.i(TAG, "向下");
} else {
Log.i(TAG, "向上");
}
}
return true;
}
});
}
...
@Override
public boolean onTouchEvent(MotionEvent event) {
mDetector.onTouchEvent(event);
return true;
}
}
通过View的onTouchEvent手势回调实现
-
第一步,通过ACTION_DOWN手势,获取手指按在屏幕上初始位置
-
第二步,通过ACTION_MOVE手势,来确定手指在屏幕上移动,然后计算移动的横向距离
-
第三步,如果这个距离大于某一个阈值,就算一个有效滑动
以水平方向滑动监听为例,看看具体实现伪代码
override fun onTouchEvent(ev: MotionEvent): Boolean {
when (ev.actionMasked) {
MotionEvent.ACTION_DOWN -> {
startTouchX = ev.x
}
MotionEvent.ACTION_MOVE -> {
if (startTouchX - ev.x > slideCriticalValue) {
// 向右滑动
onSlideListener?.onSlideRight(startTouchX - ev.x)
} else if (ev.x - startTouchX > slideCriticalValue) {
// 向左滑动
onSlideListener?.onSlideLeft(ev.x - startTouchX)
}
}
}
return true
}
完整代码实现见
SupportListenSlideView
网友评论