在我们了解 View 的知识体系之前,我们先来学习一下 View 的基础知识吧。
1.什么是 View ?
View 是 Android 中所有控件的基类,ViewGroup 也是继承 View 的,也就是 View 本身可以是单个控件也可以是多个控件组成的一组控件。
2.View 的位置参数
View 的位置主要由它的四个顶点决定,分别对应属性的:top
,left
,right
,bottom
(就是左上右下)。这些坐标全部都是相对于 View 的父容器来说的,是一种相对坐标。获取这些坐标的方法如下:
left = getLeft();
top = getTop();
right = getRight();
bottom = getBottom();
还有 4 个 属性比较重要:x
,y
,translationX
,translationY
。x
和 y
代表 View 左上角的坐标(同样是相对于父容器的),translationX
和 translationY
表示 View 显示相对于初始位置的偏移。
在没有发生平移的时候,默认为 0,此刻 x == left,y == top
;但是发生平移后,View 的 left
和 top
属性不会改变,代表初始位置的左上角,translationX
和 translationY
会发生改变,此时
x = left + translationX
,y = top + translationY
。 理解这些对于后面理解动画很有帮助。
3.MotionEvent 和 TouchSlop
- MotionEvent
手指接触屏幕后会生成一个触摸事件 MotionEvent
,事件的类型如下:
ACTION_DOWN
手指刚接触屏幕
ACTION_MOVE
手指在屏幕上移动
ACTION_UP
手指从屏幕上松开的一瞬间
MotionEvent
对象能让我们获取点击位置的 x 和 y 坐标,通过 getX()/getY()
可以获取点击位置相对当前 View 的相对坐标,而 getRawX()/getRawY()
则是获取点击位置在屏幕中的绝对位置。
- TouchSlop
Android 系统中认为滑动最小的距离,当滑动的距离大于这个常量时才认为产生了滑动。通过 ViewConfiguration.get(getContext()).getScaledTouchSlop()
获取。
4.VelocityTracker 、GestureDetector 和 Scroller
- VelocityTracker
速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。如下使用:
VelocityTracker va = VelocityTracker.obtain();
va.addMovement(event);
va.computeCurrentVelocity(1000);
int xVelocity = (int)va.getXVelocity();
int yVelocity = (int)va.getYVelocity();
va.clear();
va.recycle();
这个表示在 1000 ms 手指从左往右滑过的像素数,顺着 Android 坐标系的速度就是整数,逆着就是负数。
- GestureDetector
手势检测,用于辅助检测用户单击、长按、滑动、双击等行为,一般实现 OnDoubleTabListener
接口监听用户的双击行为。
- Scroller
弹性滑动对象,用于实现 View 的弹性滑动。在 View 中典型使用代码如下:
Scroller scroller = new Scroller(mContext);
/**
* 缓慢滚动到指定位置
* @param destX
* @param destY
*/
private void smoothScrollTo(int destX,int destY){
int scrollX = getScrollX();
int delta = destX - scrollX;
//1000 ms 内滑向 destX,效果就是慢慢滑动
scroller.startScroll(scrollX,0,delta,0,1000);
invalidate();
}
@Override
public void computeScroll(){
if(scroller.computeScrollOffset()){
scrollTo(scroller.getCurrX(),scroller.getCurrY());
postInvalidate();
}
}
网友评论