安卓如何绘制视图-How Android Draws Views

 

当Activity获取焦点的时候,将被要求绘制它的布局。Android框架控制绘制的过程,但是Activity必须提供布局层次的根节点。

绘制从布局的根基点开始,要求测量和绘制布局树。画图的过程是:遍历整个视图树,呈现每个子视图在有效区域的部分。反过来,每一个ViewGroup负责请求绘制它的每个子视图(使用draw()方法),而且每个视图负责绘制自己。因为视图树是按顺序遍历的,这意味着父视图在子视图的之前绘制,其他兄弟视图按出现在书中的顺序依次绘制。

绘制布局需要两关过程:测量关口和布局关口。测量关口是measure(int,int)实现的,而且是自上而下的视图树的遍历。在递归过程中每个视图推送尺寸规格到树上。在测量关口结束时每个视图存储了测量数据。第二关口是发生在layout(int,int,int,int)方法中而且也是自上而下的。在这个关口中每个父视图使用在测量关口中计算的尺寸负责定位它的子视图。
当一个View对象的measure()方法返回时,其getMeasuredWidth()和getMeasuredHeight()值必须设置,以及那些所有视图对象的后代。View对象测量的宽度和高度值必须遵守View对象的父类的约束,以保证在测量关口结束时所有的父视图接受他们的子视图的测量数据。父视图在子视图上可以不止一次的调用measure()方法。例如,如果所有子视图未受约束的尺寸过大或过小,父视图可以用无规格尺寸测量一次子视图以找出他们想要多大,然后用具体的数字再一次调用measure()方法(也就是说,如果子视图不同意他们每个的获取的空间,在第二关口父视图可以干预并且设置规则)
测量关口使用两个类练习维度。View对象使用 ViewGroup.LayoutParams 类告诉他们的父视图想怎样被测量和定位,ViewGroup.LayoutParams类只是描述View想要多大的宽度和高度。对于每个尺寸,可以用以下一个来描述:

 

  • 一个具体的数字
  • MATCH_PARENT,意思是View想要和父视图一样大(减小padding)
  • WRAP_CONTENT,意思是View只要足够包含它的内容那样大(增加padding)

 

ViewGroup.LayoutParams 的子类和ViewGroup的子类是有区别的。例如,RelativeLayout拥有它自己的子类ViewGroup.LayoutParams,其包含集中子视图对象水平和垂直的能力。
从父视图到子视图使用MeasureSpec对象推送要求到树上,MeasureSpec可以是以下3种模式之一:

 

  • UNSPECIFIED:用于父视图决定子View希望的尺寸.例如,LinearLayout在它的子视图上调用measure()方法通过无设定的高度和具体的240宽找出子视图在给定的240像素的宽度想要多高。
  • EXACTLY: 用于父视图给子视图一个确切的大小。子视图必须用这个尺寸,并且保证其子代在该尺寸范围内。
  • AT MOST:用于父视图给子视图一个最大尺寸。子视图必须保证它和所有子代在该尺寸范围内。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值