博客
关于我
自定义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/

    你可能感兴趣的文章
    MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
    查看>>
    MsEdgeTTS开源项目使用教程
    查看>>
    msf
    查看>>
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL数据库迁移到Oracle(二)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse更改项目名web发布名字不改问题
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    mt-datetime-picker type="date" 时间格式 bug
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>
    MyEclipse设置当前行背景颜色、选中单词前景色、背景色
    查看>>
    Mtab书签导航程序 LinkStore/getIcon SQL注入漏洞复现
    查看>>
    myeclipse配置springmvc教程
    查看>>
    MyEclipse配置SVN
    查看>>
    MTCNN 人脸检测
    查看>>
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>