自定义View(9)ViewGroup - 第五大布局容器

上篇我们以获取getMeasuredHeight值作为问题点,从源码角度分析了View的绘制流程。这篇简单做个总结和思考,并结合所学习的源码,模仿着写一个原生没有的自定义布局,流式布局TagLayout,也算是对于阅读源码的应用。

1. View的绘制流程

这里上篇已经讲过了,这里简单对绘制流程做个总结。

  • View的绘制流程的Measure方法:
    第一步performMeasure(),用于指定和测量Layout中的所有控件的宽高,对于ViewGroup,先去测量子孩子,再根据子孩子的宽高计算自己的宽高。
    第二步performLayout(),使用for循环摆放不是GONE的子布局,调用child.layout方法。如果重写View不需要重写onLayout,如果重写容器,需要重写onLayout。
    第三步performDraw(),使用了模版设计模式,用于绘制自己和子View,分为七步,包括绘制背景、绘制内容、绘制子View、绘制装饰等。对于ViewGroup首先绘制自己的背景,for循环绘制子View的draw()方法,对于View绘制自己的背景,绘制自己的显示内容。

2. 根据源码思考和优化

通过View的绘制流程,问题思考:

  • 如果要获取View的高度,前提肯定是需要调用测量方法(Measure),测量完毕之后才能获取宽高。
  • View的绘制流程是在onResume()之后才开始的。
  • addView setVisibility 等等方法时,会调用requestLayout();重新走一遍View的绘制流程。
  • 优化的时候,一般是根据源码去优化的,不要布局嵌套等。例如之前讲的调用invalidate()就会重绘所有的View,通过阅读源码,我们知道不能平凡的调用,会影响性能。

3. onMeasure()测量和onLayout()的摆放

自定义ViewGroup-流式布局TagLayout(可扩展性不太强,Adapter设计模式)

模仿其他布局类型自定义流式布局
1. onMeasure()指定宽高
    for循环测量子View
    根据子View计算和指定自己的布局
2. onLayout()
    for循环摆放所有的子View
3. onDraw() 这个就不用写了,直接使用系统自带的TextView就行

3.1 自定义TagLayout继承ViewGroup


4. 最后的测试和任务布置

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值