前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手写自定义View—流式布局

手写自定义View—流式布局

作者头像
没关系再继续努力
发布2021-12-12 22:15:44
4680
发布2021-12-12 22:15:44
举报
文章被收录于专栏:Android面试

视频:价值100w+Android项目实战大全:手把手实战,自定义View 原文: https://juejin.cn/post/6969132819855441934

View的生命周期

先onMeasure()测量 、 再onLayout()布局 、最后onDraw()绘制。

在onMeasure()度量时,会先去度量儿子(先走儿子的生命周期),想确认儿子的大小才能确认自己的大小。

自定义View分成两类:

  • 自定义View

一般继承自View,SurfaceView或其他的View。 onMeasure()--> onDraw()都会执行,onLayout()看需求

  • 自定义ViewGroup

继承自ViewGroup或各种Layout onMeasure()--> onLayout()都会执行, onDraw()看需求

自定义View包含什么

布局: onlayout onmeausre/ Layout:viewGroup 显示: onDraw :view: canvas paint matrix clip rect animation path(贝塞尔) line text绘制 frameWork: 交互: onTouchEvent :组合的viewGroup

LayoutParams与MeasureSpec

LayoutParams

LayoutParams(布局参数),也就是xml里定义的

获取

MeasureSpec

MeasureSpec是一个(32位)的int值,高两位表示父容器对 view 的布局上的限制(Mode),低30位表示view的Size

1.unspecified--无限制

2.exactly -- 确定的大小

3.at_most -- 最大不超过

实现流式布局

1.继承ViewGroup

2.自定义ViewGroup需要实现onMeasure()度量和onLayout()

3.标准开局,要度量自己的大小得先度量儿子的大小,所以遍历儿子View,去view.measure()

4.儿子的宽高是根据父亲给他的MeasureSpec的Mode + 上自己的LayoutParams算出来的,也就是上面的那个表格。如父亲给的是exactly(确定的大小),儿子又是android:layout_width="10dp",两个都是确定的,那就是10dp

5.取到儿子的宽高

6.儿子的宽高拿到了,那就是计算每行的宽度(并且取最大行宽度)。计算总的高度

7.for循环跑完了,这样每个孩子都度量完了,也知道了最大的宽高,就可以度量自己的宽高了

8.但是自己的宽高并不只受儿子的影响,还跟父亲给的Mode相关

到此onMeasure()度量完了,接下来开始布局onLayout()

9.因为度量的时候,已经确定了每一行存哪几个View,把他存到数组里,这样布局的时候简单很多

10.布局onLayout()重要的就是确定上下左右。 所谓的上下左右就是距离父亲总边框的左上角的位置

所以第一个view的左就是0,右就是 左+view的宽度。(计算时考虑view直接的margin就行) 第二个view就是 第一个View的右+第二个view的左....依次类推(用掉的宽高)

补充
view.getMeasuredWidth()与view.getWidth()

取宽高的时候为啥是view.getMeasuredWidth()。 view.getMeasuredWidth()度量之后这个就有值,但是view.getWidth()得view绘制完成 所以有的时候用view.getWidth()取值的时候是0,但是刷新一下或者下一个绘制时又有值了。

view的Visibility别忘了

是不是隐藏的情况得考虑

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • View的生命周期
  • 自定义View包含什么
  • LayoutParams与MeasureSpec
    • LayoutParams
      • MeasureSpec
      • 实现流式布局
        • 补充
          • view.getMeasuredWidth()与view.getWidth()
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档