详解Android View的事件体系 之View基础(二)

简介: 详解Android View的事件体系

前言

掌握View的事件体系是Android 向高级迈向的必经之路,本片博客讲解Android View的相关基础知识第二部分,后面我们会为大家讲解View事件体系、View事件分发等知识内容。


1.View基础

1.1 手势检测GestureDetector

首先我们看一下官方API对GestureDetector的介绍:

image.gif

GestureDetector 可以检测到用户的点击、双击、长按等事件,该类为我们提供了三个接口和一个内部类。

1.1.1 GestureDetector.OnGestureListener

        首先我们和上篇博客中提到的一样,新建一个继承自View的类,同时让这个类实现GestureDetector.OnGestureListener接口,我们可以看到该接口复写了下述方法

@Override
public boolean onDown(MotionEvent e) {
    return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
    return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    return false;
}
@Override
public void onLongPress(MotionEvent e) {
    Log.d(TAG,"长按了");
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    return false;
}

image.gif

通过   gestureDetector = new GestureDetector(this); 初始化gestureDetector,在View的OnTouchEvent事件中,交给gestureDetector来处理即,gestureDetector.onTouchEvent(event);这里我们只看onLongPress方法,顾名思义就是长按时触发的事件,我们在方法中打印Log,当我们的手指在View上长按之后打印日志如下:

image.gif

1.1.2 GestureDetector.OnDoubleTapListener

接着我们让View实现GestureDetector.OnDoubleTapListener接口,我们可以看到该接口实现了下列方法:

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
    Log.d(Tag,"双击Tap");
    return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {  
    Log.d(Tag,"双击TapEvent");
    return false;
}

image.gif

既然是双击实现,那么我们在这里只关心onDoubleTapEvent和onDoubleTap方法,我们在上述两个方法中打印日志,我们在View上双击,打印日志如下:

image.gif

由此可知onDoubleTapEvent 是双击方法结束时调用,onDoubleTap是双击发生时第一次和第二次间隔时间所触发的,如果只是单击onDoubleTap不会触发。

其实除了双击事件或者说包括双击事件,都是可以直接通过onTouchEvent()方法判断出来的,开发时开发者可根据自己需求自己选择。

1.2 VelocityTracker

      翻译过来就是追踪速度,可以判断滑动的速度以及单击的速度,首先我们获取VelocityTracker对象velocityTracker = VelocityTracker.obtain();在View的onTouchEvent方法中添加:velocityTracker.addMovement(event);

首先要计算速度,计算速度传入计算的时间差值,那么求得的速度就是每像素/时间差,比如我们计算在1S内的速度,代码如下:

velocityTracker.computeCurrentVelocity(1000);
int x = (int) velocityTracker.getXVelocity();
int y = (int) velocityTracker.getYVelocity();

image.gif

x和y分别为一秒内在x轴滑过的像素和一秒内在y轴滑过的像素。

有view坐标系可以知道,如果在x轴从右向左滑动,那么计算出来的速度为负值。不适用的时候使用clear方法和recycle方法进行内存回收。

github:huanglinqing123 (黄林晴) · GitHub


目录
相关文章
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
85 0
|
19天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
29 5
|
26天前
|
缓存 数据处理 Android开发
在 Android 中使用 RxJava 更新 View
【10月更文挑战第20天】使用 RxJava 来更新 View 可以提供更优雅、更高效的解决方案。通过合理地运用操作符和订阅机制,我们能够轻松地处理异步数据并在主线程中进行 View 的更新。在实际应用中,需要根据具体情况进行灵活运用,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在 Android 中使用 RxJava 更新 View 的技巧和方法,为开发高质量的 Android 应用提供有力支持。
|
26天前
|
缓存 调度 Android开发
Android 在子线程更新 View
【10月更文挑战第21天】在 Android 开发中,虽然不能直接在子线程更新 View,但通过使用 Handler、AsyncTask 或 RxJava 等方法,可以实现子线程操作并在主线程更新 View 的目的。在实际应用中,需要根据具体情况选择合适的方法,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在子线程更新 View 的技巧和方法,为开发高质量的 Android 应用提供支持。
30 2
|
27天前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
27天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
1月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
24 2
|
1月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
39 1
|
1月前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
1月前
|
Android开发
Android 事件分发机制详细解读
Android 事件分发机制详细解读
40 4