您的位置:首页 > 其它

View的绘制流程入门.对郭霖大大文章知识小补充

2015-12-09 15:08 344 查看
看郭霖大大的博客看晕了,经过多番找资料硬啃,终于把这一块给啃熟了.下面根据自己的理解对郭大的博客做一个简单解释吧.不知道会不会有和我一样笨的小白,如果有的话就来一起交流吧.

主要明确几个问题:

一个View的大小到底是在哪?由谁决定的?

郭霖大大的文章写了一大串,很多流程,.但是大家看到最后的话还是应该可以知道,一个View的大小是由它自己的setMeasuredDimension(width, height)方法决定的.

但是有好多东西会提供建议权,比如父View会给当前View一个建议,View自己的XML属性里也会建议.但是这些都是次要的.因为别人的建议你可以不听嘛.

也就是说,爸爸和儿子的xml文件商量了之后对儿子说:儿子啊,我和你的xml叔叔商量之后,有这么大个地方(size),你呢按照这样规格(mode)来计算你自己的大小会比较好.然后呢把mode和size传给你.但是呢,你比较听话,你就听了他们的话.你一个不高兴,你可以直接设置setMeasuredDimension(width, height).这一切的最终决定权都在View自身.

view测量出来的大小就一定等于它显示出来的大小吗?

当然不是!

本小白刚开始看郭大的文章就是在这里被绕进去了.关于View的显示大小,实际上可以这么理解.系统用一张白纸把View盖住,但是白纸上有个矩形的洞,矩形的洞里露出来的大小,就是你实际显示的大小.那么一个View到底在显示区域里能显示多大的内容,也可以理解为白纸上的洞View的哪里是在哪里指定的呢?

这就是第三个流程onLayout()中决定的了.

也就是说,onMeasure()根本没有去测量View在屏幕上的大小,而是在测量View本身的大小.但是为了尊重onMeasure()方法的结果,一般会让View的显示大小等于View的测量大小.

那么View在计算大小的时候,应该怎么知道自己的可视范围的大小呢.郭大的文章那么大的篇幅不都是在分析嘛?现在回头看看是不是概念清晰了呢?

有些View和View的某个部分被放到了显示范围之外,你看不见它,但是不意味着他不存在.它还是在内存中的.并且可以被你看到.

什么?你说怎么被看到?告诉你,Viewgroup有一个scrollBy(distanceX,distanceY)的方法,就可以移动子View的内容了.类似于这样:一张有洞的白纸盖在一块木板(View)上,木板上有字.但是洞很小,你只能看到看到一部分字.怎么才能看到其他的字呢?如果白纸不能动的话,当然只能移动木板(onlayout)了.

如果View的测量大小等于显示大小,那么View的全部内容就一定能显示出来吗?

答案当然是否定的.

这里就涉及到第三个步骤了,那就是onDraw().

事实上,View 系统希望程序员能够理解,画布(Canvas)是没有边界的,即无穷大,程序员在自定义一个具体的View时,应该在 onDraw(Canvas canvas)函数中向画布丰绘制视图的界面.此时程序员应该认为,该画布是无穷大的,即可以绘制任意多的内容或任意大的图形(只要内存足够大),然而实际应用中并不会绘制一个无穷大的界面,那么到底应该绘制一个多大的界面呢?对于不同类型的View,其绘制的大小有所不同,一般分为两种情况,一种是内容型视图,另一种是图形型视图.

所谓内容型视图一般是指,该视图将显示一段文本内容,比 如 TextView ,其绘制指的就是显示一 段文本内容,内容有多少,就应该绘制多少,所以视图的大小由内容的多少决定.换句话说,该视图”主宰”了自己的大小.

所谓图形型视图一般是指,该视图显示的是一个图形,比如三角形、正方形、背景图等,此时该视 图的大小往往会根据父视图为该View 开了一个多大的”窗口”而动态调整. “窗口”是指,在父视图看来该View应该占多大的区域,即 布 局 (layout)大小.换句话说,该视图的大小是” 被主宰” 的, 当然,如果该 View 自己愿意,技术上讲完全可以不被父视图的” 窗口” 限制,这 种 “ 被主宰”只是实 际的需求而已.比如程序员设计了一个三角形视图 TriView,使用者可以通过 layout—height和layout_width设置该三角形的布局大小,使用者一般会期望该三角形的大小能根据布局大小自动调整, 而不是显示一个固定大小的三角形. —-《Android内核剖析》

根据上面的描述可知:就算onMeasure()测量出来的大小等于View的可视大小.但是View最终能否显示完整,还是要看onDraw()里面到底画了什么.比如有个系统控件DatePicker就是内容型的,如果不设置宽高为warp_content,且设置的宽高比它需要的尺寸小的话,此控件就只能显示一个部分了.

总结:最终在屏幕上看见的内容,是当前能看到的所有层的可视范围的交集.就好像好几张有洞的白纸叠在一起,能看到的木板的内容就是这几个洞的范围的交集.

关于xml文件和父控件共同影响下,系统最终给控件提的建议是什么?

附图一张:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: