View详解
2018-10-23 本文已影响0人
kjy_112233
一、View事件体系
(1)View位置参数
- getLeft():左边到父布局左边的距离
- getTop():顶边到父布局顶边的距离
- getRight():右边到父布局左边的距离
- getBottom():底边到父布局顶边的距离
- getWidth():view的宽度
- getHeight():view的高度
- getTranslationX():左上角相对于父容器的偏移量
- getTranslationY():左上角相对于父容器的偏移量
- getX():左上角的坐标;getLeft() + getTranslationX()
- getY():左上角的坐标;getTop() + getTranslationY()
- 当设置setTranslationX()时,getLeft()不变,getX()改变;设置当setTranslationY()同理
- 需要注意的是,在onCreate()方法里无法获取到View的坐标参数,这是因为此时View还未开始绘制,全部坐标参数将都是0。
(2)View的触控
- 从源码中可以看到,MotionEvent封装了如下事件类型。
- ACTION_DOWN:第一个手指按下
- ACTION_UP :最后一个手指抬起
- ACTION_MOVE:手指在屏幕上滑动
- ACTION_CANCEL:手势被取消,不再接受后续事件
- ACTION_OUTSIDE :UI边界
- ACTION_POINTER_DOWN:非第一个手势按下
- ACTION_POINTER_UP:非最后一个手势抬起
- ViewConfiguration这个类主要定义了UI中所使用到的标准常量,像超时、尺寸、距离等。
- TouchSlop:ViewConfiguration.get(getContext()).getScaledTouchSlop() 获取系统的滑动常量来,判断此时是否属于滑动事件
- VelocityTracker:速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。
- GestureDetector:手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。
(3)View的滑动
- 实现View滑动三种办法
- 通过View本身提供的scrollTo/scrollBy方法
两者区别:scrollBy是内部调用了scrollTo的,它是基于当前位置的相对滑动;而scrollTo是绝对滑动,因此如果利用相同输入参数多次调用scrollTo()方法,由于View初始位置是不变只会出现一次View滚动的效果而不是多次。 - 通过动画给View施加平移效果
通过改变View的LayoutParams使得View重新布局 - 使用Scroller:与scrollTo/scrollBy不同,scrollTo/scrollBy过程是瞬间完成的,非平滑;而Scroller则有过渡滑动的效果。
注意:Scoller本身无法让View弹性滑动,它需要和View的computerScroller方法配合使用。
(4)View事件分发机制
- dispatchTouchEvent:事件分发
- onInterceptTouchEvent:事件拦截
- onTouchEvent:事件处理
(5)View滑动冲突
- 方向不一致:通过onInterceptTouchEvent方法判断是否拦截事件,默认不拦截。
- 方向一致::需要外部重写onInterceptTouchEvent方法判断点击位置坐标,来判断是否拦截事件