SUV
measurespec(面试官:简述View的绘制流程,答不出来就别想拿Offer了)

measure:为测量宽高过程,如果是ViewGroup还要在onMeasure中对所有子View进行measure操作。layout:用于摆放View在ViewGroup中的位置,如果是ViewGroup要在onLayout方法中对所有子View进行layout操作。draw:往View上绘制图像。

示意图如下: 确实不想画图了,从刚哥的书里拍一张吧~~~

面试官:简述View的绘制流程,答不出来就别想拿Offer了nerror="javascript:errorimg.call(this);">

2.1 Measure

performMeasure()源码

private void performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec) {      if (mView == null) {          return;      }      try {          mView.measure(childWidthMeasureSpec, childHeightMeasureSpec);      } finally {          Trace.traceEnd(Trace.TRACE_TAG_VIEW);      }}

可以看出从mView(最顶层ViewGroup)开始进行测量操作,然后逐层遍历View并执行measure操作。

MeasureSpac

MeasureView绘制三个过程中的第一步,提到Measure就不得不提MeasureSpac它是一个32位int类型数值,高两位SpacMode代表测量模式,低30位SpacSize代表测量尺寸,是View的内部类,源码如下:

public class MeasureSpec {        private static final int MODE_SHIFT = 30;          private static final int MODE_MASK  = 0x3 << MODE_SHIFT;          public static final int UNSPECIFIED = 0 << MODE_SHIFT;          public static final int EXACTLY = 1 << MODE_SHIFT;          public static final int AT_MOST = 2 << MODE_SHIFT;    }

内部也包含三种测量模式:

  • UNSPECIFIED :父布局不会对子View做任何限制,例如我们常用的ScrollView就是这种测量模式。
  • EXACTLY :精确数值,比如使用了match_parent或者xxxdp,表示父布局已经决定了子View的大小,通常在这种情况下View的尺寸就是SpacSize
  • AT_MOST :自适应,对应wrap_content子View可以根据内容设置自己的大小,但前提是不能超出父ViewGroup的宽高。

注意点:

Canvas:画布,不管是文字,图形,图片都要通过画布绘制而成Paint:画笔,可设置颜色,粗细,大小,阴影等等等等,一般配合画布使用Path:路径,用于形成一些不规则图形。Matrix:矩阵,可实现对画布的几何变换。

总结

文章从四个方面总结了View的绘制流程:绘制时机,宽高测量,位置摆放,图像绘制,因为侧重于流程所以只是把这四部分的精华给拎出来分享给大家,起到一个抛砖引玉的作用,想要透彻理解启动流程、玩转自定义View还需要对各部分知识系统的学习。

如何系统学习Android呢?

这里今天给大家分享一份Android进阶学习资料,主要为安卓相关知识点及面试资料为主,在这个PDF中,通过详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用。

帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这个PDF中有所收获。一些基础不好的,这里也有一份安卓基础资料包,帮助巩固基础。

以下是这份PDF主要内容

  • Android 核心技术:介绍 Android 开发中常用的核心技术,比如自定义 View、Handler,以及一些开源框架的原理实现,来夯实你的底层能力。只有底层能力足够出色,之后的进阶之路才会更加轻松。
  • 常见问题剖析:介绍一些项目中常见的疑难问题,使你能够对现有项目做出合理的重构优化。

1、确定好方向,梳理成长路线图

不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。

关于这一点,在我当时确立好Android方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细。

面试官:简述View的绘制流程,答不出来就别想拿Offer了nerror="javascript:errorimg.call(this);">

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:

面试官:简述View的绘制流程,答不出来就别想拿Offer了nerror="javascript:errorimg.call(this);">

2、通过源码来系统性地学习

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

面试官:简述View的绘制流程,答不出来就别想拿Offer了nerror="javascript:errorimg.call(this);">

《486页超全面Android开发相关源码精编解析》

3、阅读前辈的一些技术笔记

面试官:简述View的绘制流程,答不出来就别想拿Offer了nerror="javascript:errorimg.call(this);">

《960全网最全Android开发笔记》

4、刷题备战,直通大厂

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

面试官:简述View的绘制流程,答不出来就别想拿Offer了nerror="javascript:errorimg.call(this);">

《379页Android开发面试宝典》

以上文章中的资料,均可以免费分享给大家来学习,

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图;

需要的朋友,直接转发+点赞+私信回复【资料】一键领取!!!

学习技术是一条长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!


顶一下()     踩一下()

热门推荐

发表评论
0评