View的基础知识
一、什么是View
Android中,控件大致可分为两大类,即View与ViewGroup。View是Android中所有控件的基类,是控件的一种抽象。ViewGroup即控件组,可以把它看作一个容器,因为它可以包含多个View及ViewGroup。通过ViewGroup,整个界面上的控件形成了一个树形结构,也就是我们常说的控件树。
二、Android中的坐标系
根据参考对象的不同,Android中存在两个坐标系。一个是Android坐标系,一个是视图坐标系,两者的区别在于坐标原点的选取。坐标系的单位长度是1px。
![](https://img.haomeiwen.com/i3146876/3b71f7d20df50e3d.png)
1. Android坐标系
Android坐标系的坐标原点是手机屏幕左上角,向右为X轴正方向,向下为Y轴正方向。方法getRawX()和getRawY()获得的坐标就是此坐标系中的坐标。
2. 视图坐标系
视图坐标系的坐标原点是父控件的左上角,向右为X轴正方向,向下为Y轴正方向。其实大多数与位置有关的参数都是视图坐标系中的坐标点。
三、位置参数与方法
位置参数与方法繁多,但这些都是必须掌握的,是触摸事件、滑动控件的基础。学习这些参数、方法最有效的方式就是自己打Log,根据Log信息去分析方法的含义。
![](https://img.haomeiwen.com/i3146876/3be9aa114c0c07d3.png)
- View提供的获取坐标的方法:
getTop():view自身顶边到父控件顶边之间的距离。
getLeft():view自身左边到父控件左边之间的距离。
getRight():view自身右边到父控件左边之间的距离。
getBottom():view自身下边到父控件顶边之间的距离。
note:这几个方法获取的是视图坐标值。它们只与view初始摆放位置有关,也就是说在移动控件的过程中,这些方法的返回值是不会随控件的位置改变的,除非认为修改了它们的值,如修改了margin值。
- MotionEvent(触摸事件)提供的方法:
getX():点击事件(触控点)距离当前控件左边之间的距离。
getY():点击事件(触控点)距离当前控件顶边之间的距离。
getRawX():点击事件(触控点)距整个屏幕左边之间的距离。
getRawY():点击事件(触控点)距整个屏幕上边之间的距离。
note:前两个方法获取的坐标值是视图坐标值。你可以将触控点理解为当前view中的内容,那么它的父控件就是当前view。
后两个方法获取的坐标值是绝对坐标值。这四个方法通常用来计算偏移量。
四、MotionEvent——触控事件
MotionEvent即触控事件,典型触控事件有如下几种:
- ACTION_DOWN=0——单点触摸按下;
- ACTION_MOVE=2——触摸点移动;
- ACTION_UP=1——单点触摸抬起;
- ACTION_CANCEL=3——触摸动作取消;
正常情况下,一次手指触摸屏幕的行为至少会有两个事件发生,即按下抬起(按下取消)。这其中还可能会有一系列的ACTION_MOVE事件。
通常情况下,我们会在onTouchEvent(MotionEvent event)方法中通过event.getAction()方法获取触控事件的类型,并使用switch语句筛选,模板代码如下:
public boolean onTouchEvent(MotionEvent event){
//获取当前输入点的坐标
int x=(int)event.getX();
int y=(int)event.getY();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
.....//处理按下事件
break;
case MotionEvent.ACTION_MOVE:
.......//处理移动事件
break;
case MotionEvent.ACTION_UP:
.......//处理抬起事件
break;
}
return true;
}
五、TouchSlop——最小滑动距离
TouchSlop即最小滑动距离,当你两次滑动之间的距离差小于这个常量(这个常量和设备有关)时,系统不认为你进行了滑动操作,这样我们可以使应用具有更好的用户体验。
可以通过如下方法获得这个值:
ViewConfigration.get(getContext()).getScaledTouchSlop();
同样,你也可以在源码中找到这个常量的定义:
Path:frameworks/base/core/res/res/values/config.xml
<dimen name="config_viewConfigrationTouchSlop">
六、VelocityTracker——速度追踪器
速度追踪器,用它可以监测手指水平竖直滑动速度。使用步骤:
- 关联触摸事件
VelocityTracker velocityTracker=VelocityTracker.obtain();
velocityTracker.addMovement(event); - 计算速度
velocityTracker.computeCurrentVelocity(1000);
//这里的参数是指“时间间隔”,速度=(终点-起点)/时间段,由此可知我们计算的速度是平均速度,速度可正可负,单位为像素/秒或者像素/毫秒。 - 获取速度(获取之前必须先计算)
int xVelocity=(int)velocityTracker.getXVelocity();
int yVelocity=(int)velocityTracker.getYVeloctiy(); - 重置并回收
velocityTracker.clear();
velocityTracker.recycle();
七、GestureDetector——手势监测器
手势监测,顾名思义,用于监测用户单击,滑动,长按,双击等行为。步骤如下:
- 创建GestureDetector对象,实现OnGestureListener接口
GestureDetector mGestureDetector=new GestureDetector(this); - 接管目标view的onTouchEvent方法
boolean consume=mGestureDetector.onTouchEvent(event);
return consume; - 有选择的实现OnGestureListener和OnDoubleTapListener中的方法,这两个接口中有各种各样的诸如,单击,双击,长按,严格单击等等方法。这里不一一列出,可去查看相关文档。
建议:如果只是监听滑动相关的事件,使用onTouchEvent方法,如果监听双击事件,使用GestureDetector实现。
结语
基础知识先写到这里,本人也是一个初学者,未免出现对知识点理解不全面的情况,有问题可留言,希望能与大家互相讨论,共同学习。
转载请注明出处http://www.jianshu.com/p/b600895c585b 谢谢。