博客
关于我
自定义View:流式布局FlewLayout
阅读量:511 次
发布时间:2019-03-07

本文共 1986 字,大约阅读时间需要 6 分钟。

View布局系统的深度解析:从MeasureSpec到自定义ViewGroup

在Android开发中,View布局系统是核心的一部分,而自定义ViewGroup如FlowLayout的实现则为开发者提供了更大的灵活性。本文将从布局系统的基础到自定义ViewGroup的实现,深入探讨MeasureSpec的作用、布局流程以及实际应用中的优化方法。

一、MeasureSpec的核心作用

MeasureSpec是Android中View布局系统的核心机制,它通过一个32位的整数来封装布局信息,包含尺寸和模式。高两位表示模式(MeasureMode),低30位表示尺寸。模式分为三种:

  • UNSPECIFIED:系统不限制View的大小,尺寸由内容决定。
  • EXACTLY:View的尺寸必须严格等于指定值。
  • AT_MOST:View的尺寸不能超过指定值。
  • 通过MeasureSpec,父View可以根据子View的需求和自身约束,递归计算子View的尺寸,最终确定整个布局的尺寸。

    二、LayoutParams与MeasureSpec的关系

    LayoutParams在XML布局中用于定义View的布局属性,常见的属性包括:

    • layout_width:可以是固定的dp值(如100dp),或使用MatchParent或WrapContent。
    • layout_height:同样可以是固定的dp值或使用MatchParent/WrapContent。

    然而,LayoutParams中的值并非直接转化为具体的尺寸,而是通过布局系统的递归过程,结合父布局的MeasureSpec,计算出最终的测量值。

    三、自定义ViewGroup的实现:FlowLayout

    1. onMeasure方法

    onMeasure方法是自定义ViewGroup(如FlowLayout)的核心,负责测量子View的尺寸。测量过程是递归的:

  • 清除测量参数:确保每次测量都从初始状态开始。
  • 遍历子View:逐个测量子View的尺寸。
  • 递归测量:调用getChildMeasureSpec,结合父布局的MeasureSpec和子View的LayoutParams,计算子View的测量值。
  • 确定布局尺寸:根据测量结果,计算整体的宽度和高度,并调用setMeasuredDimension。
  • 2. onLayout方法

    onLayout方法负责根据测量结果,将子View布局到屏幕上。布局过程包括:

  • 初始化位置:根据父View的左、上、右、下边距,确定子View的初始位置。
  • 遍历子View:根据测量结果,逐一布局每个子View,计算其右、下坐标。
  • 更新布局位置:根据子View的布局位置,更新当前行的位置和下一行的顶部位置。
  • 四、代码实现分析

    1. dp2px方法

    dp2px方法用于将dp值转换为px值,适用于在代码中使用自定义单位。

    2. onMeasure方法

    在onMeasure中,首先清除之前的测量参数,然后遍历每个子View:

    • 获取子View的LayoutParams:了解子View在XML中的布局属性。
    • 计算MeasureSpec:根据父布局的MeasureSpec和子View的LayoutParams,调用getChildMeasureSpec,计算子View的测量值。
    • 测量子View:调用measure方法获取子View的实际尺寸。
    • 计算布局尺寸:根据测量结果,确定整体的宽度和高度,并调用setMeasuredDimension。

    3. onLayout方法

    在onLayout中,根据测量结果布局子View:

    • 初始化布局位置:根据父View的边距,确定子View的初始位置。
    • 遍历子View:逐个布局子View,计算其右、下坐标。
    • 更新布局位置:根据子View的布局位置,更新当前行的位置和下一行的顶部位置。

    五、常见问题与优化

    1. 如何处理未知尺寸?

    在布局系统中,未知尺寸通常使用UNSPECIFIED模式,系统会根据内容自动计算尺寸。可以通过设置layout_width和layout_height为UNSPECIFIED,结合布局属性,如Gravity,优化布局效果。

    2. 测量过程中的内存管理

    在onMeasure中,确保清除旧的测量参数,避免内存泄漏。使用清除方法,释放不再使用的变量。

    3. 布局性能优化

    在onLayout中,避免不必要的计算,尽量减少循环操作,优化布局性能。可以预先计算子View的布局位置,减少重复计算。

    六、总结

    通过对MeasureSpec、LayoutParams、onMeasure和onLayout的深入理解,可以更高效地开发自定义ViewGroup,优化布局效果。掌握这些核心机制,有助于更好地定制布局,提升应用的用户体验。

    转载地址:http://urfjz.baihongyu.com/

    你可能感兴趣的文章
    mysql之联合查询UNION
    查看>>
    mysql之连接查询,多表连接
    查看>>
    mysql乐观锁总结和实践 - 青葱岁月 - ITeye博客
    查看>>
    mysql也能注册到eureka_SpringCloud如何向Eureka中进行注册微服务-百度经验
    查看>>
    mysql乱码
    查看>>
    Mysql事务。开启事务、脏读、不可重复读、幻读、隔离级别
    查看>>
    MySQL事务与锁详解
    查看>>
    MySQL事务原理以及MVCC详解
    查看>>
    MySQL事务及其特性与锁机制
    查看>>
    mysql事务理解
    查看>>
    MySQL事务详解结合MVCC机制的理解
    查看>>
    MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
    查看>>
    MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
    查看>>
    webpack css文件处理
    查看>>
    mysql二进制包安装和遇到的问题
    查看>>
    MySql二进制日志的应用及恢復
    查看>>
    mysql互换表中两列数据方法
    查看>>
    mysql五补充部分:SQL逻辑查询语句执行顺序
    查看>>
    mysql交互式连接&非交互式连接
    查看>>
    MySQL什么情况下会导致索引失效
    查看>>