View 篇

版权声明:该博客为博主原创,转载请标明出处! https://blog.csdn.net/DJH2717/article/details/83961302

1, MotionEvent是什么?包含几种事件?什么条件下会产生?

答: MotionEvent 是一个封装了 Android 中事件信息的类, 可以把其理解为 javaBean, 我们可以通过这个类来获取某次事件的信息.  常见的事件有 down up move cancel 等等事件, 主要需要注意下的就是 cancel 事件的产生情况,  cancel 事件会在一个 view 的父 view(viewGroup)收回事件处理权的时候, 这个子 view 便会接受到 cancel 事件.

  举个例子说明就是当在同一个事件流中, viewGroup 没有拦截 down 事件, 因此 down 事件便会被 相应的 子 view 所处理, 接下来的 move 事件如果 viewGroup 进行了拦截, 那么此时处理了 down 事件的子 view 便会接受到 cancel 事件, 以用来恢复状态.  其实这么做是很合情合理的, 因为在 Android 中, 事件流必须要以 down 开始, 以 up 结束才算一个完整的事件流, 如果没有接受到 up 事件, 那么说明这个操作被取消了, 因此会接受到一个 cancel 事件.

2, scrollTo()和scrollBy()的区别?

答: scrollTO 是针对初始的滑动位置, 也就是没有滑动的 (0,0) 状态, 传入的值是相对于初始状态的绝对偏移量,  而 scrollBy 是针对当前值, 传入的值是针对当前滑动位置的相对偏移量.

3, Scroller中最重要的两个方法是什么?主要目的是?

答:  Scroller 的实现原理和属性动画的 ValueAnimator 很类似, 其都是对传入的数值通过时间的流逝比例来计算出某一个时间点上具体的数值,  其中最重要的两个方法是 startScroll 和 computeScrollOffset  方法,  startScroll 主要是传入数据, 并把数据进行保存, 以便后续进行计算, 而 computeScrollOffset  方法主要是根据当前的时间流逝比例来判断滑动是否已经完成.



4, 谈一谈View的事件分发机制?

答: View 的事件分发机制, 主要从 view 和 ViewGroup 的几个对应的方法进行研究, 最开始接受到事件的是 Activity dispatchTouchEvent方法, 其然后会派发到 window,  而 window 的派发到 DecoreView 则是由 viewRoot 来实行, 当事件被派发到 DecoreView 后, 整个事件序列流可以说就开始遵循了 view 和 ViewGroup 的派发机制, 大致概括一下就是事件会从上往下进行派发, 处理则是从下往上进行处理.  详细介绍

5, SurfaceView和View的区别?

答: SurfaceView 是继承自 view 的, 其和 view 很相似, 但是其有一个特点是可以在子线程中更新 UI, 也正是因为这个特点, SurfaceView 主要用来显示那些需要频繁刷新 UI 或者绘制时间较长的控件, 其和 view 的主要区别也就是在这里, view 主要用于一些普通控件的展示, 不要频繁快速的刷新 UI , 绘制时间较短, 这样才不会导致主线程的 UI 卡顿.

6, 自定义View/ViewGroup需要注意什么?

答: 

7, invalidate()和postInvalidate()的区别?

答: invalidate 和 postInvalidate 都是用来进行重新绘制 view, 刷新界面用的, 区别是一个 invalidate 只能在主线程调用, 而 postInvalidate 可以在子线程调用.

8, 如何解决View的滑动冲突?

答: 在 Android 中, 之所以会出现滑动冲突, 是因为Android 中的事件处理是一锤子买卖, 一个事件只能给某一个具体的 View 来进行处理, 一但某个 View 处理并消费了这个事件后, 其他 view 便无法再接受和处理这个事件,  所以,要想从根本上解决 view 的事件冲突, 关键在于对事件分发机制的掌握, 然后根据不同的业务需要, 人为的把某次事件给我们想要的那个 view 来进行处理,   Android事件分发

9, 谈谈View的工作原理?

答:  View 的工作原理, 主要需要从 measure, layout 和 draw 这三个流程方面去考虑, 这三个流程的起点都是 viewRootImp, 其是 WindowMangerGolable 的主要实现细节,   

  measure流程是的起点是在 viewRootImp 的 performMeasure处调用了 DecorView 的 measure, 而 DecorView 是一个 FrameLayout, 其 onMeasure 方法便会遍历所有的子view, 而子 view 也如此反复的去执行这一套流程, 便完成了整个 view 树的遍历. 

  至于 layout 的流程,  就较为简单, layout 方法用来确定自己的位置, 而且 ViewGroup 的这个方法是一个 final 方法, 然后调用到 onLayout 方法用来确定孩子的位置. 

  draw 的流程主要分为 4 步, 绘制背景, 绘制内容, 绘制孩子, 绘制前景.


 

10, MeasureSpec是什么?有什么作用?

答: MeasureSpec 在 view 的测量过程中用来辅助 view 的测量的, 其字面意思是测量规格, 其是一个 int 的整数, 前两位代表测量模式(共三种), 后30 为代表具体的测量尺寸. 其产生的方式是根据 view 的布局参数然后结合父布局的布局参数来产生的.

11, onTouch(), onTouchEvent(),和 onClick() 的关系?

答: onTouch是属于 view 的外部 touch 监听, 其是用于 setOnTouchListener 中的回调,  onTouchEvent 是属于内部监听, 一般是在自定义 view  中重写这个方法, 然后执行具体的逻辑, 而 onClick 是属于对点击的监听,  他们之间的具体关系是, onTouch 和 onTouchEvent 都是在 dispatchTouchEvent 方法中得到调用, 在 调用 onTouchEvent 之前, 系统会判断是否设定了 touchListener, 如果有, 则先执行, 返回值会影响到 onTouchEvent 是否得到调用, 如果返回 true, 则事件被消费, 不会调用到 onTouchEvent, 在 onTouchEvent 中会调用到 onClick, 也是先判断是否设定了监听, 会在 onTouchEvent 的 up action 执行 onClick 回调.


 

猜你喜欢

转载自blog.csdn.net/DJH2717/article/details/83961302
今日推荐