美文网首页
ViewGroup 自定义的实现

ViewGroup 自定义的实现

作者: SniffsTheRose | 来源:发表于2018-08-23 15:23 被阅读0次

ViewGroup 的自定义(继承 ViewGroup)

需要进行以下两步:

  1. 重写 onMeasure() 来计算内部布局;
    将控件需要的空间通过 setMeasuredDimension(xxx, xxx) 保存。

  2. 重写 onLaytout 来摆放子 View;
    此方法的参数代表着整个控件的摆放位置坐标。 至于 子View 摆在哪里, 如何摆,都是建立在摆放的位置坐标基础上的。

具体一点来说,就是:

重写 onMeasure()

分以下 3 步

1.计算传递给子view约束条件。也就是给 子View 的两个MeasureSpec.

  • 计算方式有两种:

第一种:

  • 结合开发者要求(通过child.getLayoutParams()获得Layout_XXX)和自己的可用空间(自己的尺寸上限 - 已用尺寸)
  • 尺寸上限根据自己的 MeasureSpec 中的 Mode 而定;
    • 如果是 AT_MOST/EXACTLY, 那么尺寸上限就是 MeasureSpec 中 size
    • 如果是 UNSPECIFIED, 尺寸无上限

第二种:

for (int i = 0; i < getChildCount(); i++) {
    View childView = getChildAt(i);
    LayoutParams layoutParams = childView.getLayoutParams();
    int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 0, layoutParams
            .width);
    int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, 0, layoutParams
            .height);
    childView.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
  1. 调用每个子 View 的 measure(), 传入上一步计算的 MeasureSpec。

  2. 在子 View 进行计算, 并在最后 setDimension 保存子 View 的位置和尺寸

  3. 计算自己的尺寸并用 setMeasuredDimension() 保存

重写 onLayout

父view 在遍历所有 子View 的 onMeasure(...) 之后就可以拿到每个 子View 需要占用的空间,然后 父View 就接着遍历所有 子View 的 onLayout(...), onLayout 的参数就是 父View 分配给 子View 摆放的位置。

相关文章

网友评论

      本文标题:ViewGroup 自定义的实现

      本文链接:https://www.haomeiwen.com/subject/ibqmiftx.html