Android 面试知识点
Requestlayout,OnLayout,OnDraw,DrawChild 区别与联系
requestLayout()方法 :会导致调用 measure()过程 和 layout()过程 。说明:只是对 View 树重新布局 layout 过程包括 measure()和 layout()过程,不会调用 draw()过程,但不会重新绘制任何视图包括该调用者本身。
onLayout()方法(如果该 View 是 ViewGroup 对象,需要实现该方法,对每个子视图进行布局)
onDraw()方法绘制视图本身 (每个 View 都需要重载该方法,ViewGroup 不需要实现该方法)
drawChild()去重新回调每个子视图的 draw()方法。
Android 为每个应用程序分配的内存大小是多少?
android 程序内存一般限制在 16M,也有的是 24M。
Android View 刷新机制
由 ViewRoot 对象的 performTraversals()方法调用 draw()方法发起绘制该 View 树,值得注意的是每次发起绘图时,并不会重新绘制每个 View 树的视图,而只会重新绘制那些“需要重绘”的视图,View 类内部变量包含了一个标志位 DRAWN,当该视图需要重绘时,就会为该 View 添加该标志位。调用流程 :
mView.draw()开始绘制,draw()方法实现的功能如下:绘制该 View 的背景为显示渐变框做一些准备操作。
调用 onDraw()方法绘制视图本身 (每个 View 都需要重载该方法,ViewGroup 不需要实现该方法)
调用 dispatchDraw ()方法绘制子视图(如果该 View 类型不为 ViewGroup,即不包含子视图,不需要重载该方法)值得说明的是,ViewGroup 类已经为我们重写了 dispatchDraw ()的功能实现,应用程序一般不需要重写该方法,但可以重载父类函数实现具体的功能。
LinearLayout 对比 RelativeLayout
RelativeLayout 会让子 View 调用 2 次 onMeasure,LinearLayout 在有 weight 时,也会调用子 View2 次 onMeasure
RelativeLayout 的子 View 如果高度和 RelativeLayout 不同,则会引发效率问题,当子 View 很复杂时,这个问题会更加严重。如果可以,尽量使用 padding 代替 margin。在不影响层级深度的情况下,使用 LinearLayout 和 FrameLayout 而不是 RelativeLayout。
为什么 Google 给开发者默认新建了个 RelativeLayout,而自己却在 DecorView 中用了个 LinearLayout。因为 DecorView 的层级深度是已知而且固定的,上面一个标题栏,下面一个内容栏。采用 RelativeLayout 并不会降低层级深度,所以此时在根节点上用 LinearLayout 是效率最高的。而之所以给开发者默认新建了个 RelativeLayout 是希望开发者能采用尽量少的 View 层级来表达布局以实现性能最优,因为复杂的 View 嵌套对性能的影响会更大一些。
评论