什么是View?
View是Android中所有控件的基类,View是一种界面层的控件的一种抽象。除了View,还有ViewGroup,ViewGroup内部可以包含许多控件,即一组View。在Android中,ViewGroup也继承了View,所以View本身就可以是单个控件也可以是由多个控件组成的一组控件,通过这种关系就形成View的树状结构。
View的位置
View的位置由它的四个顶点决定,对应View的四个属性top(左上角纵坐标)、left(左上角横坐标)、right(右下角横坐标)、bottom(右下角纵坐标),这些坐标都是相对于View的父容器来说的,因此是一种相对坐标。
width = right – left
height = bottom – top
在View的源码中对应于mLeft、mRight、mTop和mBottom四个成员变量,获取方式:getLeft()、
getRight()、getTop()、getBottom()。View的几个参数:x、y、translationX、translationY,x和y是View左上角的坐标,translationX、translationY是View左上角相对父容器的偏移值(默认为0),View也为它们提供了get/set方法。需要注意的,View在平移过程中,top和left表示原始左上角的位置信息,其值并不会发生改变,此时发生改变的是x、y、translationX、translationY。
x = left + translationX
y =top + translation
MontionEvent和TouchSlop
手指接触屏幕后所产生的一系列事件:
ACTION_DOWN —— 刚接触屏幕
ACTION_MOVE —— 在屏幕移动
ACTION_UP —— 从屏幕上松开的一瞬间
点击屏幕后离开松开:DOWN -> UP
点击屏幕后滑动一会再离开松开:DOWN -> MOVE -> MOVE -> … -> UP
通过MotionEvent对象可以得到点击事件发生的x和y坐标,getX/getY (当前View左上角的x和y坐标),getRawX/getRawY (返回相对手机屏幕左上角的x和y坐标)。
TouchSlop是系统所能识别出的被认为是滑动的最小距离,可用在两次滑动事件中对滑动距离的判断,有助于更好的用户体验。
通过ViewConfiguration.get(getContext()).getScaledTouchSlop()
获取
VelocityTracker
用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。
GestureDetector
手势检测,辅助检测单击、滑动、长按、双击等行为。如果只监听滑动相关,可以在onTouchEvent中实现,如果监听双击,那么就使用GestureDetector
Scroller
弹性滑动对象,用于实现View的弹性滑动。当使用View的scrollTo/scrollBy进行滑动时是瞬时的,Scroller可以实现过渡效果,增加用户体验。
实现View滑动
1)通过View本身提供的scrollTo/scrollBy(操作简单,适合对View内容的滑动)
2)通过动画给View施加平移效果 (操作简单,适合没有交互的View和实现复杂动画效果)
3)通过改变View的LayoutParams使View重新布局 (操作稍复杂,适合有交互的View)
实现弹性滑动
1)Scroller
2)通过动画
3)使用延时策略