一、View基础
-
getX和getRawX的区别,坐标系
-
MotionEvent有几种事件
-
scrollTo和scrollBy的区别
-
scrollTo是绝对滑动
-
scrollBy内部调用了scrollTo是基于当前位置的相对滑动
-
两者都只能对View的内容进行滑动,而不能使view本身滑动
-
-
SurfaceView和View的区别
-
SurfaceView是从View基类中派生出来的显示类
-
View需要在UI线程进行刷新,SurfaceView可以在子线程进行页面的刷新
-
View适用于主动更新,SurfaceView适用于被动更新
-
SurfaceView在底层已实现双缓冲机制,SurfaceView更适用于需要频繁刷新、刷新时数据处理量很大的页面
-
二、View的事件分发
-
为什么会有分发机制
-
安卓上面的View是树形结构,View可能会重叠在一起,当我们点击的地方有多个View都可以响应时,这个点击事件应该给谁呢?
-
-
事件分发三个重要方法
-
dispatchTouchEvent
-
onInterceptTouchEvent
-
onTouchEvent
-
-
事件分发流程
-
Activity -> PhoneWindow -> DecorView -> ViewGroup -> ........ -> View
-
-
事件分发过程中方法优先级onTouch() -> onTouchEvent() -> onClick()
-
onTouchListener的onTouch先触发,返回false才会触发onTouchEvent,具体查看View的dispatchTouchEvent方法即可
-
-
View的滑动冲突
-
外部拦截: 点击事件都先经过父容器的拦截处理
-
内部拦截:父容器不拦截,将所有事件传递给子容器,子容器进行消耗处理,否则回传给父容器处理
-
三、View的工作原理相关
-
View的工作流程,简单来说就是先measure侧向,用于测量View的宽高,然后在layout布局,用于确定View的最终宽高和四个顶点的位置,然后再draw绘制。
-
measure方法需要注意ViewGroup.LayoutParams和父容器的MeasureSpec来确定子View的MeasureSpec
-
MeasureSpec组成含义,作用
-
通过宽高测量值决定View的大小
-
由一个32位的int组成,高两位代表SpecMode(测量模式),低30位代表SpecSize(测量规格)
-
-
invalidate方法和postInvalidate方法以及requestLayout方法区别
-
invalidate在主线程中调用,如果在子线程需要配合handler,会执行draw方法重绘,而不会重新measure、layout
-
postInvalidate可以直接在子线程里调用,会执行draw方法重绘,而不会重新measure、layout
-
requestLayout会触发measure、layout方法,draw方法
-