写点什么

Android 面试知识点

作者:沃德
  • 2022 年 7 月 07 日
  • 本文字数:975 字

    阅读完需:约 3 分钟

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 嵌套对性能的影响会更大一些。

用户头像

沃德

关注

我就是个零 2018.06.14 加入

程序员而已

评论

发布
暂无评论
Android 面试知识点_android_沃德_InfoQ写作社区