Q:MotionEvent是什么?包含几种事件?什么条件下会产生?
ACTION_UP:手指按下
ACTION_MOVE:手指移动
ACTION_UP:手指抬起
ACTION_CANCEL:手指重当前view移动到外层view时
Q:scrollTo()和scrollBy()的区别?
scrollTo()为视图 绝对距离 的移动,scrollBy()为视图 相对距离 的移动,内部包含了scrollTo(scollX+dx,scollY+dy),dx和dy就是scrollBy()的相对距离传值。
Q:Scroller中最重要的两个方法是什么?主要目的是?
startScroll()和computeScroll(),首先Scroller系统封装类为了解决scrollTo()和scrollBy()滑动不顺畅的。
Scroller内含插值器,让我们控件可以平滑的滑动、先加速后减速、先减速后加速滑动等,执行流程:
1、初始化Scroller
2、调用startScroll()开始滚动,此时并真的开始,只是录入时间,距离,Interpolator等
3、执行invalidate()刷新界面
4、重写View的computeScroll()并在其内部实现与滚动相关的业务逻辑,这里才开始真正的滚动逻辑,这里可以条用scrollTo()进行滚动,在第二步已经给出了相关参数,我们可以计算出当前步需要滚动的距离以及时间
5、再次执行invalidate()刷新界面
Q:谈一谈View的事件分发机制?
这个分发机制最好理解是一张U形图:
Q:如何解决View的滑动冲突?
解决冲突可以从两方面着手:
外部view拦截:如果外部viewGroup需要滑动则调用onInterceptTouchEvent并在内部做相应的拦截,放回true让viewGroup的onTouchEvent()消费事件
内部view拦截:父容器不拦截任何事件,传递给子view如果需要就进行拦截,这种就需要我们在子view通知父容器不要拦截当前我需要的事件,通知方式为requestDisallowInterceptTouchEvent()
Q:谈一谈View的工作原理?
view的工作工程包含onMesure() 测量宽高、onLayout()布局、onDraw绘图三个主要过程;而整个绘制过程其实是一颗viewTree的绘制,即由根视图向子视图进行绘制:activity----PhoneWindow------DecoreView-----view;
最后我们整个绘制过程全写在了performTraversals()方法中,如下:
view绘制.png
Q:MeasureSpec是什么?有什么作用?
MeasureSpec是一种可以提供父容器布局向子view宽高转换的静态工具类,里面大多是位运算,提供三种控制模式:
UNSPECIFIED:无限制模式,
EXACTLY:父向子指定精确的尺寸,
AT_MOST:父向子提供一个最大尺寸;
onMesure()中通过宽测量值widthMeasureSpec和高测量值heightMeasureSpec决定View的大小
Q:自定义View/ViewGroup需要注意什么?
1、测量好宽高onMesure()
2、内部避免调用handler,使用view.post
3、线程和动画需要及时关闭
4、处理好嵌套
Q:onTouch()、onTouchEvent()和onClick()关系?
执行先后顺序:onTouch()>onTouchEvent()>onClick()
Q:SurfaceView和View的区别?
view 在主线程进行刷新,适合一般的界面;SurfaceView可以在子线程进行频繁刷新,适合数据量大的界面,比如视频、相机、游戏
Q:invalidate()和postInvalidate()的区别?
主线程刷新:invalidate()
子线程刷新:postInvalidate()
网友评论