**[我的博客](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的工作机制。
二:view的位置参数
view的位置是由view的四个顶点决定的,分别对应view的四个属性:left top right bottom 。其中top 是view左顶点的纵坐标,left是view左定点的横坐标,right 是view右顶点的横坐标,bottom是view右顶点的纵坐标。需要注意的是,这些坐标是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开发艺术探索》总结的读书笔记,在此表示膜拜和感谢。
网友评论