Android自定义支持滑动监听View

简介: Android自定义支持滑动监听View

前言

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

相关文章
|
25天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
52 1
|
3月前
|
JavaScript Android开发
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
63 0
|
3月前
|
Android开发 容器
Android UI设计: 什么是View和ViewGroup?
Android UI设计: 什么是View和ViewGroup?
36 0
|
4天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
21 1
|
4天前
|
Shell Android开发 开发者
Android系统 自定义动态修改init.custom.rc
Android系统 自定义动态修改init.custom.rc
23 0
|
4天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
19 0
|
29天前
|
Android开发
Android 开发 pickerview 自定义选择器
Android 开发 pickerview 自定义选择器
12 0
|
3月前
|
Android开发 Kotlin 索引
Android Compose——ScrollableTabRow和LazyColumn同步滑动
Android Compose——ScrollableTabRow和LazyColumn同步滑动
|
6天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库