第五大容器布局——流式布局

①、performLayout :View -> layout() -> onLayout()

②、摆放子布局 for循环所有子View, 前提不是GONE,调用child.layout()

③、performDraw() : View -> draw() -> drawBackground();//画背景
onDraw(canvas);// 画自己 ViewGroup 默认情况下不会调用
dispatchDraw(canvas);// 画子View 不断的循环调用子View的 draw()

面试 [ View的绘制流程]

第一步 performMeasure():用于指定和测量layout中所有控件的宽高,对于ViewGroup,先去测量里面的子孩子,根据子孩子的宽高再来计算和指定自己的宽高,对于View,它的宽高是由自己和父布局决定的。

第二步 performLayout(): 用于摆放子布局,for循环所有子View,用child.layout()摆放ChildView

第三步 performDraw(): 用于绘制自己还有子View , 对于ViewGroup首先绘制自己的背景,for循环绘制子View调用子View的draw()方法, 对于View绘制自己的背景,绘制自己显示的内容(TextView)

思考问题:

  • 如果要获取View的高度,前提肯定需要调用测量方法,测量完毕之后才能获取宽高

  • View的绘制流程是在 onResume() 之后才开始(Activity 启动流程的源码)

  • addView setVisibility 等等 会调用requestLayout(); 重新走一遍View的绘制流程

  • 优化的时候,根据知道源码写代码的时候优化, onDraw() 不要布局嵌套,等等

1.流式布局:我之前写过二篇文章:http://blog.csdn.net/qq_24675479/article/details/78921070,动态添加流式布局http://blog.csdn.net/qq_24675479/article/details/78928339这里不阐述了

2.自定义View和ViewGroup套路总结

2.1 自定义View的套路:

    2.1.1 自定义属性,获取自定义属性(达到配置的效果) 
    2.1.2 onMeasure()方法用于测量计算自己的宽高,前提是继承自View,如果是继承自系统已有的 TextView , Button ,已经给你计算好了宽高
    2.1.3 onDraw() 用于绘制自己的显示 
    2.1.4 onTouch() 用于与用户交互

2.2 自定义ViewGroup的套路:

    2.2.1 自定义属性,获取自定义属性(达到配置的效果)很少有

    2.2.2 onMeasure() 方法,for循环测量子View,根据子View的宽高来计算自己的宽高

    2.2.3 onDraw() 一般不需要,默认情况下是不会调用,如果你要绘制需要实现dispatchDraw()方法

    2.2.4 onLayout() 用来摆放子View,前提是不是GONE的情况

    2.2.5 在很多情况下不会继承自ViewGroup ,往往是继承 系统已经提供好的ViewGroup 如 ViewPager ScrollView  RelativeLayout
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值