Learn && Live
虚度年华浮萍于世,勤学善思至死不渝
前言
Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习、复盘过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/C5RI5,话不多说我们马上开始!
1.什么是View?
View:界面层的控件的一种抽象,代表一个控件
ViewGroup:内部包含多个控件,即一组View
ViewGroup继承了View,即View本身可以单个控件也可以是多个控件组成的一组控件
2.View的位置参数有哪些?
top:View左上角的初始y坐标,getTop()
left:View左上角的初始x坐标,getLeft()
bottom:View右下角的初始y坐标,getBottom()
right:View右下角的初始x坐标,getRight()
y:View左上角的当前y坐标,getY()
x:View左上角的当前x坐标,getX()
translationY:View左上角相对于初始位置的y偏移量,getTranslationY(),y = top + translationY
translationX:View左上角相对于初始位置的x偏移量,getTranslationX(),x = left + translationX
rawY:View左上角相对于手机屏幕左上角的y坐标,getRawY()
rawX:View左上角相对于手机屏幕左上角的x坐标,getRawX()
3.MotionEvent和TouchSlop
MotionEvent
- ACTION_DOWN:手指接触屏幕的一瞬间
- ACTION_MOVE:手指在屏幕上移动
- ACTION_UP:手指从屏幕离开的一瞬间
正常情况下触摸屏幕会触发的事件序列:
(1)点击屏幕后手指离开:DOWN --> UP
(2)点击屏幕滑动一会再松开:DOWN --> MOVE --> … --> MOVE --> UP
TouchSlop
系统所能识别出的被认为是滑动的最小距离,只有滑动的距离超过这个值,系统才会认为是一次滑动
这是一个常量,和设备有关,不同设备这个值可能不同
// 获取TouchSlop
ViewConfiguration.get(getContext()).getScaledTouchSlop()
// frameworks/base/core/res/res/values/config.xml
<dimen name="config_viewConfigurationTouchSlop">8dp</dimen>
4.VelocityTracker、GestureDetector和Scroller
VelocityTracker
速度追踪,用于追踪手指在滑动过程中的速度,包括水平和垂直速度
// 获取tracker并追踪当前事件
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
// 计算速度并获取水平、垂直速度
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
// 重置并回收内存
velocityTracker.clear();
velocityTracker.recycle();
注意两点
(1)获取速度,即getXVelocity()、getYVelocity()之前必须调用computeCurrentVelocity()计算速度
(2)这里的速度指一段时间间隔内手指滑过的像素数,computeCurrentVelocity()的参数为时间间隔,单位为ms
速度 = (终点位置 - 起点位置) / 时间间隔
(3)速度有方向,即值有正负:手指从左向右、从上向下滑动速度为正值,反之为负值
GestureDetector
手势检测,辅助检测单击、滑动、长按、双击等行为
建议监听滑动相关的自己在onTouchEvent中实现,监听双击行为使用GestureDetector
比较常用的有:onSingleTagUp(单击)、onFling(快速滑动)、onScroll(滑动)、onLongPress(长按)、onDoubleTap(双击)
Scroller
弹性滑动对象,用于实现View的弹性滑动