How Android Draws Views 安卓如何绘制view


安卓如何绘制view(How Android Draws Views
当一个activity获得焦点,activity就会绘制他的布局。安卓框架会处理绘制的步骤,但是activity必须提供它布局的根节点。
绘制从布局根节点开始。它被要求按照布局的树形结构进行测量和绘制。
Drawing is handled by walking the tree and rendering each View that intersects the invalid region.
通过遍历树和渲染每个子视图进行绘制
依次,每个ViewGroup负责调用它每个孩子的绘制(用draw()方法)每个View负责自己的绘制。因为这个树是按照一定顺序排列的,
意思是父布局和它在树中出现的兄弟姐妹在它的孩子前绘制。
绘制布局两个过程:一个测量步骤和一个布局步骤。测量步骤在measure(int,int)中实现,自上而下遍历View树。每个View在循环期间将尺寸规格叠加到树上。
在测量最后阶段,每个View已经存储了它的测量值。第二个阶段在layout(int,int,int,int)中进行,同样是自上而下。
在这个阶段每个父布局根据测量阶段计算的尺寸负责放置所有它的孩子的位置。
当一个View对象的measure()方法结束后,它的 getMeasuredWidth() and getMeasuredHeight()的值就已经设置好了,
这个View的子节点的值也都有了。一个View对象测量的宽度和测量的高度值必须遵守它的父布局给它的约束。这个确保在测量最后阶段所有的父布局接收了它所有子View的测量值。
一个父布局View可能会不止一次调用他孩子的measure()方法。例如,父布局会用未指定的尺寸测量每个孩子一次找出他们想要多大,
如果在不受约束的情况下测量出的尺寸太大或太小就用确切的数字再调用他们的measure()测一次(如果子View不同意他们互相之间的尺寸,父布局将会在第二阶段进行设置规则并干预)。
测量阶段用两个类来传递尺寸数据。 View类用ViewGroup.LayoutParams来告诉父布局他们怎么测量和布局。基类 ViewGroup.LayoutParams只是用来描述View想要多宽多长。它可以指定一下尺寸当中的一个。
MATCH_PARENT
表明View想要和它的父布局一样大(减去padding)
WRAP_CONTENT
表明View大小正好包裹自己内容(加上padding)
ViewGroup的不同子类要用到ViewGroup.LayoutParams的不同子类。例如,ViewGroup.LayoutParams有提供给相对布局的子类,
能让子View横向和纵向排列。
测量规格(MeasureSpec)类在树形结构中从父布局传递到孩子。MeasureSpec可以是下面三种模式之一:
UNSPECIFIED:这个用在一个父布局获取孩子想要什么样的尺寸。例如,一个线性布局设置高度为UNSPECIFIED宽度为EXACTLY 240调用在它孩子的measure()
找出子View在给定240像素宽度的情况下想要什么样的高度。
EXACTLY: 这个用在父布局强制子View确定的尺寸。子View必须使用这个尺寸,并且保证所有的子节点都遵守这个尺寸。
AT MOST: 这个用在父布局强制指定一个子View最大值。子View必须保证它和子节点适应这个尺寸。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值