Android中的View树结构
-
Android 中每个控件都会在界面中占得一块矩形区域
-
通过 ViewGroup 整个界面上的控件形成了一个树形结构,即控件树
-
上层控件负责下层控件的测量与绘制,并传递触摸事件
-
findViewById 就是在控件树中以深度优先搜索的方法查找对应元素
-
在每颗控件树的顶部,都有一个 ViewParent 对象,它是整棵树的控制核心,所有的交互事件由它来统一调度和分配。
View坐标系
-
相对于 View:
- getX:触摸点相对于组件左边界的距离
- getY:触摸点相对于组件上边界的距离
-
相对于屏幕
- getRawX:触摸点对于屏幕左边界的距离
- getRawY:触摸点对于屏幕上边界的距离
-
getTop():View 自身的顶边到其父布局顶边的距离
-
getLeft():View 自身的左边到其父布局左边的距离
-
getRight():View 自身的右边到其父布局左边的距离
-
getBottom():View 自身底边到其父布局顶边的距离
TouchSlop-滑动事件的临界点
TouchSlop 是系统认为进行了滑动操作的最小距离, 也就是说如果滑动距离小于这个距离, 则则系统认为没有进行滑动操作.它定义在frameworks/base/core/res/values/config.xml 中
ViewConfiguration.get(context).getScaledTouchSlop()
// 源码
mTouchSlop = res.getDimensionPixelSize(
com.android.internal.R.dimen.config_viewConfigurationTouchSlop);
<dimen name="config_viewConfigurationTouchSlop">8dp</dimen>
滑动速度跟踪类VelocityTracker
VelocityTracker是一个跟踪触摸事件滑动速度的帮助类,用于实现flinging以及其它类似的手势。它的原理是把触摸事件 MotionEvent 对象传递给VelocityTracker的addMovement(MotionEvent)方法,然后分析MotionEvent 对象在单位时间类发生的位移来计算速度。你可以使用getXVelocity() 或getXVelocity()获得横向和竖向的速率到速率时,但是使用它们之前请先调用computeCurrentVelocity(int) 来初始化速率的单位
// 1. 获取 VelocityTracker
VelocityTracker tracker = VelocityTracker.obtain();
// 2. 重写 onTouchEvent 方法,添加 TouchEvent 事件,并计算速度
tracker.addMovement(event);
// 设置计算速度的时间 1000ms
tracker.computeCurrentVelocity(1000);
// 获取速度, xVelocity 表示 1000ms 内手指在屏幕上滑动了多少个像素
// 注意 : 速度可以为负值, 速度 = (终点位置 - 起点位置) / 时间段
// 这里的速度是单位时间内的平均速度
int xVelocity = (int)racker.getXVelocity();
int yVelocity = (int)tracker.getYVelocity());
// 3. 释放
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if(tracker != null) {
tracker.clear();
tracker.recycle();
tracker = null;
}
}
当你需要跟踪触摸屏事件的速度的时候,使用obtain()方法来获得VelocityTracker类的一个实例对象
在onTouchEvent回调函数中,使用addMovement(MotionEvent)函数将当前的移动事件传递给VelocityTracker对象
使用computeCurrentVelocity (int units)函数来计算当前的速度,使用getXVelocity ()、 getYVelocity ()函数来获得当前的速度