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

相关文章
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
84 0
|
16天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
18天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
28 5
|
25天前
|
缓存 数据处理 Android开发
在 Android 中使用 RxJava 更新 View
【10月更文挑战第20天】使用 RxJava 来更新 View 可以提供更优雅、更高效的解决方案。通过合理地运用操作符和订阅机制,我们能够轻松地处理异步数据并在主线程中进行 View 的更新。在实际应用中,需要根据具体情况进行灵活运用,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在 Android 中使用 RxJava 更新 View 的技巧和方法,为开发高质量的 Android 应用提供有力支持。
|
25天前
|
缓存 调度 Android开发
Android 在子线程更新 View
【10月更文挑战第21天】在 Android 开发中,虽然不能直接在子线程更新 View,但通过使用 Handler、AsyncTask 或 RxJava 等方法,可以实现子线程操作并在主线程更新 View 的目的。在实际应用中,需要根据具体情况选择合适的方法,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在子线程更新 View 的技巧和方法,为开发高质量的 Android 应用提供支持。
30 2
|
26天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
29天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
24 2
|
1月前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
38 3
|
3月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
View的绘制和事件处理是两个重要的主题,上一篇《图解 Android事件分发机制》已经把事件的分发机制讲得比较详细了,这一篇是针对View的绘制,View的绘制如果你有所了解,基本分为measure、layout、draw 过程,其中比较难理解就是measure过程,所以本篇文章大幅笔地分析measure过程,相对讲得比较详细,文章也比较长,如果你对View的绘制还不是很懂,对measure过程掌握得不是很深刻,那么耐心点,看完这篇文章,相信你会有所收获的。
119 3
|
4月前
|
消息中间件 前端开发 Android开发
Android面试题自定义View之Window、ViewRootImpl和View的三大流程
Android开发中,View的三大核心流程包括measure(测量)、layout(布局)和draw(绘制)。MeasureSpec类在测量过程中起到关键作用,它结合尺寸大小和模式(EXACTLY、AT_MOST、UNSPECIFIED)来指定View应如何测量。onMeasure方法用于自定义View的测量,布局阶段,ViewGroup调用onLayout确定子元素位置,而draw阶段按照特定顺序绘制背景、内容、子元素和装饰。整个流程始于ViewRootImpl的performTraversals,该方法触发测量、布局和绘制。
116 0