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

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

 前言

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

1.View基础

1.1 什么是View

简单的说View是所有控件的“祖宗”,无论TextView、Button、Linearlayout,还是ListView、RecycleView,他们的基类都是View,多个View形成了ViewGroup,ViewGroup本身也是View,比如,TextView是一个View,LinearLayout是一个ViewGroup,ViewGroup中又可以添加许多View

1.2 View 坐标

View坐标是相对于View的父容器来讲的,View看作一个矩形,则View的左上角坐标为(left,top),Vew的右下角的坐标为(right,top),View如果发生改变,这四个值并不会发生改变,改变的是View的偏移量,坐标系如图1所示。

                                                                   image.gif

                                                                                       图 1.View坐标系

由坐标系则可以看出View的宽度为right - left 即getLeft() - getRight();View的高度为bottom - top 即getBoottom() -  getTop();

在我刚开始接触Android的时候,在我想象中的样子View的坐标为图2 所示,莫名的感觉图2更符合我的思维习惯。

                                                                 image.gif

                                                                                        图 2 错误坐标系

1.3 View触摸事件

    当手指触摸在View上的时候会触发MotionEvent中的ACTION_DOWN事件,当手指松开时会触发ACTION_UP 事件,如果我们的手指View上滑动又会触发ACTION_MOVE事件,在这里为了验证,我们新建一个类继承自View,重写他的onTouchEvenEvent事件,代码如下所示:

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.d(Tag, "按下了");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.d(Tag, "移动中");
            break;
        case MotionEvent.ACTION_UP:
            Log.d(Tag, "抬起了");
            break;
        default:
            break;
    }
    return true;
}

image.gif

我们在xml布局中引用这个View,现在我们将手指放在屏幕上并移动一段时间抬起,打印结果如下:

image.gif

由此我们可以验证上述.

我们可以使用getX和getY方法获取当前View左上角的坐标,由此我们可以通过记录分别记录按下和抬起时坐标,通过坐标计算可以判断用户是左右滑动或者上下滑动,代码如下所示:

@Override
public boolean onTouchEvent(MotionEvent event) {
    startX = (int) event.getX();
    startY = (int) event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            pressX = startX;
            pressY = startY;
            break;
        case MotionEvent.ACTION_MOVE:
            enxX = startX;
            endY = startY;
            break;
        case MotionEvent.ACTION_UP:
            if (enxX - pressX > 0) {
                Log.d(Tag, "向右滑动");
            } else {
                Log.d(Tag, "向左滑动");
            }
            break;
        default:
            break;
    }
    return true;
}

image.gif

由View坐标系我们可以知道如果抬起时X的值 大于 按下时X的值那么说明用户向右滑动了。现在我们手指向右滑动打印日志如下:

image.gif

反之,手指向左滑动打印:

image.gif

在我们操作的过程中,我们可能会发现有时候我们不经意点击一下,也会显示向左滑动或者向右滑动,如果我们使用此方法来做用户交互操作的话,用户可能不经意间就误操作了,所以在这里判断用户滑动我们需要一个临界值,这个临界值也就是最小滑动距离,最简单的我们可以在代码中判断滑动距离大于某个临近值的时候才判为用户滑动了,如果小于临界值则判为用户误操作,但把临近值写死显得并不友好,临近值和设备有关系,不同的设备临近值不同,所以我们引出了最小滑动距离TouchSlop。

1.4 TouchSlop

TouchSlop是系统默认的滑动最小距离,我们可以通过

ViewConfiguration.get(context).getScaledDoubleTapSlop()

image.gif

来获取系统中定义的这个临界值大小,用户判断用户是否滑动。

在framework层源码中定义了TouchSlop的值大小,源码如图所示,不同设备上该值得大小是不同的。

image.gif

上述就是 View基础知识的第一部分。


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