1. 什么是View
View是所有控件的基类,下到各种Button,TextView,ImageView,上到LinearLayout,RelateLayout,甚至你自定义的控件,都是继承View这个基类,所以说,View是代表着界面层的一个抽象控件。除了View,还有一种叫ViewGroup,也就是控件组。ViewGroup本身也继承了View,View可以理解为存放很多View的组合,例如,LinearLayout本身是一个View,它也是一个ViewGroup。ViewGroup里面有子View,这个子View也是一个ViewGroup。
2. View的位置参数
View的位置是由四个顶点决定,分别是top,left,right,bottom(相对于父容器)
- top:左上角纵坐标
- left:左上角横坐标
- right:右下角横坐标
- bottom:右下角纵坐标
注意:在android等移动设备系统中,x轴和y轴的正方向分别对应右和下的方向
通过以上属性,我们可以获取到 View 的 长度 和 宽度:
width = right - left
height = bottom - top
//获取一个button的 坐标 ,长度 ,宽度
int top = mViewGetCoordinate.getTop();
int left = mViewGetCoordinate.getLeft();
int right = mViewGetCoordinate.getRight();
int bottom = mViewGetCoordinate.getBottom();
int width = right - left;
Android 3.0以后,新增了 x,y,translationX, translationY这几个参数。
- x : View 左上角的横坐标
- y : View 左上角的纵坐标
- translationX :View左上角横坐标相对于父容器的偏移量
- translationY :View左上角纵坐标相对于父容器的偏移量
- x = left - translationX
y = top - translationY
注意:View在平移的过程中,top和 left 表示的是原始左上角的位置信息,其值不会发生改变 ,此时发生改变的是x , y , translationX , translationY。
3. MotionEvent和TouchSlop
MotionEvent是手指在接触屏幕后产生的一系列事件,主要有一下几种:
- ACTION_DOWN:手指刚接触到屏幕
- ACTION_MOVE:手指在屏幕上移动
- ACTION_UP:手指从屏幕上松开
从MotionEvrnt对象还可以得到点击事件发生的x和y的坐标,系统提供两组方法:
- getX/getY:返回相对于当前View的的左上角坐标
- geeRawX/getRawY:返回相对于手机屏幕左上角的坐标
TouchSlop是系统所能识别的=出的被认为是滑动操作的最小距离。这是一个常量,跟设备有关,可以通过以下的方式获取这个常量:
ViewConfiguration.get(getContext()).getScaledTouchSlop()
4. VelocityTracker,GuestDetector和Scroller
VelocityTracker 是速度追踪,用于追踪手指屏幕上的滑动速度,分为垂直方向的速度和竖直方向的速度。
使用过程如下:
首先:在View 的onTouchEvent方法中追踪单击事件的速度。
其次:获取当前的速度。
mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
VelocityTracker velocityTracker = new VelocityTracker.obtain();
velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();
Toast.makeText(ViewSlideSpeedActivity.this ,"滑动的水平方向的速度:" + xVelocity +
" " + "滑动的竖直方向的速度:" + yVelocity ,Toast.LENGTH_LONG).show();
velocityTracker.clear(); //重置方法
velocityTracker.recycle(); //回收方法
return true;
}
});
注意:
- velocityTracker.computeCurrentVelocity(1000)是设置计算速度的间隔时间
- 当不需要使用时需要调用clear来重置并回收方法
GuestDetector 是手势检测,用于辅助检测单击长按,滑动,双击等行为
Scroller 是弹性滑动对象 。使用View的scrollTo/scrollBy方法进行滑动时,其过程是瞬间的,体验不好。使用Scroller 可以实现滑动的过度动画效果。