1 什么是 View
View 是Android中所有控件的基类,例如Button和TextView、ViewGroup 等常见控件他们的基类都是View,View是一种界面层的控件的一种抽象,代表了一个控件。View 本身可以是单个控件也可以是由多个控件组成的一组控件,通过这种关系就形成了View 树的结构,与Web前端中的DOM树概念相似。
1.1 View的位置参数
View 的位置主要有四个顶点决定的, top(左上角纵坐标)、left(左上角横坐标)、right(右下角横坐标)、bottom(右下角纵坐标),这些顶点的坐标是相对于 View 的父容器来说,是一种相对坐标。
view 源码中他们对应于mLeft、mRight、mTop、mBottom这四个成员变量,获取方式如下:
Left=getLeft() 、Right=getRight() 、Top=getTop() 、Bottom=getBottom()
2 MotionEvent 和 TouchSlop
1. MotionEvent 是指用户手指触摸屏幕产生的一系列事件 分为 ACTION_DOWN(手指刚接触屏幕), ACTION_MOVE(手指在屏幕上滑动), ACTION_UP(手指从屏幕上松开瞬间)。
2. 点击屏幕后松开,事件序列 DOWN->UP点击屏幕滑动一会再松开,事件序列为 DOWN->MOVE->…->MOVE->UP。
3. getX/getY获取相对当前View左上角的x和y坐标;getRawX/getRawY获取相对手机屏幕左上角的x和y坐标。
4. TouchSlop 是系统能识别滑动的最小距离,是系统常量,与设备有关,不同设备,值可能不同,当手指在屏幕上滑动,小于这个距离,系统不认为你在进行滑动操作;可通过ViewConfiguration.get(getContext()).getScaledTouchSlop()方法来获取;可以利用此参数进行一些滑动过滤,当未达到此值的时候可以认为未达到滑距离的临界值。
3 GestureDetector 和Scroller
GestureDetector
用于辅助检测用户的单击、滑动、长按、双击等行为;
OnGestureListener 接口的方法
onDown : 手指轻轻触摸屏幕的瞬间,由一个 ACTION_DOWN 触发;
onShowPress : 手指轻触屏幕,尚未松开或者拖动, 由一个 ACTION_DOWN 触发;
onSingTapUp : 手指松开,由 ACTION_DOWN 触发, 这是单击行为;
onScroll: 手指按下屏幕并拖动,由一个 ACTION_DOWN , 多个 ACTION_MOVE 触发, 这是拖动行为;
onLongPress: 用户长久地按着屏幕不放,即长按;
onFling: 用户按下触摸屏,快速移动后松开,由一个 ACTION_DWON、多个 ACTION_MOVE 和一个 ACTION_UP 触发,快速滑动行为;
OnDoubleTapListener 接口中的方法
onDoubleTap: 双击,由两次连续的单击组成,不能和 onSingleTapConfirmed 共存;
onSingleTapConfirmed: 单击行为;
onDoubleEvent: 表示双击行为,在双击的期间, ACTION_DOWN、ACTION_MOVE、ACTION_UP 都不会触发此回调。
在实际开发中可以不使用 GestureDetector ,完全可以在View的 onTouchEvent 方法中根据MotionEvent类型以及滑动速度等条件实现所需的监听,作者建议:如果只是监听滑动相关的推荐在onTouchEvent中实现,如果需要监听双击,使用GeststureDetector。
2.Scroller
用来实现View的弹性滑动,View的scrollTo/scrollBy是瞬间完成的,Scroller本身并不能实现view的滑动,使用Scroller配合View的computeScroll方法配合使用达到弹性滑动的效果,它不断地让view重绘,而每一次重绘距滑动起始时间会有一个时间间隔,通过这个时间间隔Scroller就可以得出view的当前的滑动位置,知道了滑动位置就可以通过scrollTo方法来完成view的滑动。就这样,view的每一次重绘都会导致view进行小幅度的滑动,而多次的小幅度滑动就组成了弹性滑动,这就是Scroller的工作原理