美文网首页
Android自定义支持滑动监听View

Android自定义支持滑动监听View

作者: GameProgramer | 来源:发表于2022-07-13 11:42 被阅读0次

    前言

    平时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

    相关文章

      网友评论

          本文标题:Android自定义支持滑动监听View

          本文链接:https://www.haomeiwen.com/subject/nfnzbrtx.html