前言
平时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 }
完整代码实现见