[Andorid开发艺术探索 读书笔记]View的事件体系(一)

来源:互联网 发布:港澳台直播软件 编辑:程序博客网 时间:2024/04/30 03:53

Android中,View的事件体系是一个很大也很重要的话题。

这篇博客中我们先来看一些关于View的一些基本概念和滑动的基础知识,在后面的博客中,我们会详细探索View的事件分发机制。


什么是View 

        View是Android中的所有控件的基类,不管是Button,TextView,还是RelativeLayout和ListView,他们共同的基类都是View,所以说,View是一种界面层的控件的抽象。除了View,还有ViewGroup,ViewGroup也继承了View,这就意味着View本身就可以是单个控件也可以是多个控件组成的一组控件,通过这种关系就形成了View树的结构。

        比如说,我们知道Button显然是个View,而LinearLayout不但是一个View而且还是一个ViewGroup,而ViewGroup内部是可以有子View的,这个子View同样还可以有ViewGroup的,以此类推。

        明白这种层级关系有助于理解View的工作机制。


View的位置参数

       View的位置主要是由它的四个顶点来决定的,分别对应于View的四个属性:top,left,right,bottom,其中,top是左上角纵坐标,left是左上角横坐标。right是右下角横坐标,bottom是右下角纵坐标。需要注意的是,这个坐标都是相对于View的父容器来说的,因此是一种相对坐标,View的坐标体系和父容器关系如图:



注意这里的x轴和y轴和我们一般数学上的坐标轴正方向是相反的,其实不止Android,很多显示系统都是按照这个方向来的。

根据这个图示,我们很容易得到view的宽高和坐标的关系:

width = right - left

height = bottom - top

这四个参数分别对应View源码中的mLeft, mRight, mTop, mBottom 这四个成员变量。获取方式类似于left= getLeft();

从Android 3.0 开始,View增加了几个额外的参数:x,y,translationX和translationY。其中x,y是View左上角的坐标,translationX和translationY是View左上角相对于父容器的偏移量。这几个参数也是相对于父容器来说的。

值得注意的是translationX和translationY参数主要用在View平移中,当View发生平移的时候,之前介绍的top,left这些参数是不会变的,但是translationX和translationY这些参数会变。我们可以轻松得到:

x = left + translationX;

y = top + translationY;


MotionEvent和TouchSlop

MotionEvent

在手指接触屏幕后所产生的一系列事件中,典型的事件类型主要有:

ACTION_DOWN - 手指刚接触屏幕
ACTION_MOVE - 手指在屏幕上滑动
ACTION_UP - 手指从屏幕上松开的一瞬间

正常情况下,一次手指触摸屏幕的行为会触发一系列点击事件,考虑如下情况:
点击屏幕后离开松开,事件序列为:DOWN -> UP;
点击屏幕滑动一会再松开,事件序列为: DOWN -> MOVE -> MOVE -> ... >MOVE -> UP

想要获取点击事件发生的坐标也很简单,系统提供了两组方法: getX/getY 和 getRawX/getRawY。他们的区别其实很简单 getX/getY获得的是相对于当前View左上角的x和y坐标,而getRawX/getRawY返回的是相对于手机屏幕左上角的x和y坐标

TouchSlop

TouchSlop是系统所能识别的被认为是滑动的的最小距离,换句话说,如果两次滑动的距离小于这个常量,那么系统就不认为你是在进行滑动操作。
这个常量和设备有关,不同的设备这个值可能是不同的,通过如下方式可以获取这个常量:ViewConfiguration.get(getContext()).getScaledTouchSlop()。
0 0