博客
关于我
自定义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 导出数据
    查看>>
    mysql 将null转代为0
    查看>>
    mysql 常用
    查看>>
    MySQL 常用列类型
    查看>>
    mysql 常用命令
    查看>>
    Mysql 常见ALTER TABLE操作
    查看>>
    MySQL 常见的 9 种优化方法
    查看>>
    MySQL 常见的开放性问题
    查看>>
    Mysql 常见错误
    查看>>
    mysql 常见问题
    查看>>
    MYSQL 幻读(Phantom Problem)不可重复读
    查看>>
    mysql 往字段后面加字符串
    查看>>
    mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
    查看>>
    MySQL 快速创建千万级测试数据
    查看>>
    mysql 快速自增假数据, 新增假数据,mysql自增假数据
    查看>>
    MySql 手动执行主从备份
    查看>>
    Mysql 批量修改四种方式效率对比(一)
    查看>>
    mysql 批量插入
    查看>>
    Mysql 报错 Field 'id' doesn't have a default value
    查看>>
    MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
    查看>>