Android view的基础知识

**[我的博客](https://zhaozhenye.github.io/)**

一:什么是view

view是Android中所有控件的基类。不管是简单的button、textview还是复杂的relativeLayout、listview ,他们的基类都是view. 所以说,view是界面层控件的一种抽象,他代表了一个控件。

ViewGroup顾名思义,控件组的意思。需要注意的是viewGroup也是继承自view的。这表明view既可以表示单个控件也可以表示一组控件。通过这种关系,就形成了view树结构的概念。

view–view

–viewGroup–view

–viewGroup …

这种概念类似于前端DOM树的概念。理解view的层级关系有助于我们理解view的工作机制。

《Android view的基础知识》

二:view的位置参数

view的位置是由view的四个顶点决定的,分别对应view的四个属性:left top right bottom 。其中top 是view左顶点的纵坐标,left是view左定点的横坐标,right 是view右顶点的横坐标,bottom是view右顶点的纵坐标。需要注意的是,这些坐标是view相对于父容器来说的,说到底是一种相对坐标。

《Android view的基础知识》

通过上图,我们可以很清楚的得出view宽高的计算公式:

width = right-left

height= bottom-top

那么如何得到这四个变量呢?Android源码中,它们对应mLeft mRight mTop mBottom 四个变量。获取方式如下:

mLeft = getLeft();

mRight = getRight();

mTop = getTop();

mBottom= getBottom();

接下来有一个比较难理解的知识点,请注意:

在Android3.0以后,view增加了几个变量:x y translationX translationY 

其中的x y 是view左上角的坐标。translationX 和translationY是view相对父view的偏移量。默认 translationX translationY  都是0.

x= left +translationX;

y= top +tranlationY;

需要注意的是:view平移过程中,left top 是不会发生变化的,它们表示view的原始值,不会发生变化。发生改变的是x y translationx translationy

三:motionEvent 和TouchSlop

(一):motionEvent

手指接触屏幕会产生一系列的事件,典型的有以下几种:

ACTION_UP:手指刚接触屏幕的时候;

ACTION_MOVE:手指在屏幕移动的时候;

ACTION_DOWN:手指抬起的一瞬间:

一种情况:手指点击屏幕后松开离开: 事件序列为:DOWN–UP

一种情况:手指点击屏幕移动然后松手离开:事件序列为:DOWN-MOVE-MOVE….-UP

通过motionEvent对象,我们可以得到点击事件发生的x坐标和y坐标。有两种方式:getx() getRawX();其中,getX()是相对于当前view左上角的x 和 y 的坐标。getRawX()是相对于手机屏幕左上角x 和 y的坐标。

(二):TouchSlop(Distance in pixels a touch can wander before we think the user is scrolling)

TouchSlop是被系统所识别,认为是滑动的最小距离。简单说,如果你手指滑动小于它的话,就不认为你在进行滑动。这个和系统有关,每个系统的TouchSlop是不同的,他是一个常量。通过代码可以获取到具体值。ViewConfiguration.get(getContext()).getScaledTouchSlop().

(三):VelocityTracker GestureDetector 和Scroller

Velocity:速率

VelocityTracker:速度追踪。用于追踪手势在滑动过程中的速度,包括水平和垂直方向的速度。

使用方式:

1:在view的onTouchEvent()方法中追踪当前点击事件的速度

VelocityTracker velocityTracker= VelocityTracker.obtain();

        velocityTracker.addMovement(event);

2 : 获取当前的速度

velocityTracker.computeCurrentVelocity(1000);

        float xVelocity = velocityTracker.getXVelocity();

        float yVelocity = velocityTracker.getYVelocity();

注意两点:一:获取速度前,需要计算速度。二:这里的速度指的是一段时间內手指所划过的像素。注意速度可能为负值,当从左往右滑动,速度为正值,从右往左滑动,速度为负值。从下面的计算公式你就你能明白,为什么是这样的了。

速度 = (终点位置-起点位置)/时间。

结合Android坐标系,向右和向下是正方向,就可以理解为什么出现负值的情况了。

上面的参数1000,是1000ms內,滑动的像素。如果改成100,那就是100ms內滑动的像素,很容易理解

当不需要使用的时候重置,并清理内存

velocityTracker.clear();

        velocityTracker.recycle();

GestureDetector:手势识别,这个内容很多,很重要,有必要单独写篇文章

Scroller

弹性滑动对象,用于实现view的弹性滑动。

我们知道使用view的scrollTo scrollBy 的滑动过程是瞬间完成的,但是这种用户体验非常不好。Scroller是有过渡效果的滑动,在一定时间內完成滑动。Scroller本身不能实现弹性滑动,它需要和View配合使用才能完成这个功能。

本文主要是对任玉刚先生的《Android开发艺术探索》总结的读书笔记,在此表示膜拜和感谢。

    原文作者:勇敢写信
    原文地址: https://www.jianshu.com/p/c4a755ef3f1c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞