青岛做网络直播的网站网站推广服务方案
文章目录
-  
- 继承ViewGroup
 - 重写onMeasure方法:计算并设置布局控件的高度
 - 重写onLayout方法:计算并设置每个子控件的位置
 - 具体的代码实现
 - 小结
 
 
继承ViewGroup
重写generateLayoutParams,设置子控件的LayoutParams为MarginLayoutParams类型
    @Overridepublic LayoutParams generateLayoutParams(AttributeSet attrs) {return new MarginLayoutParams(getContext(), attrs);} 
重写onMeasure方法:计算并设置布局控件的高度
子控件的两种情况
第一种情况:所有子控件的宽度是一致且固定的,布局控件的宽度是固定,高度不确定
1.获取子控件的固定的宽高
measureChildWithMargins(childView, widthMeasureSpec, 0, heightMeasureSpec, 0);
int childWidth = child.getMeasuredWidth();
int childHeight = child.getMeasuredWidth(); 
注意:使用View.getMeasuredWidth/Height()需要确保使用之前,该View对象已经被measure过
2.获取布局控件的measured宽度
int width = MeasureSpec.getSize(widthMeasureSpec); 
3.计算一行放置多少个子控件,根据子控件个数和布局控件的measured宽度确定布局控件的高度
setMeasuredDimension(width, height); 
第二种情况:每个子控件的宽度都不固定,布局控件的宽度是固定,高度不确定
1.获取布局控件的measured宽度
int width = MeasureSpec.getSize(widthMeasureSpec); 
2.遍历布局控件中所有子控件
1.获取每个子控件的宽度
measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);
childWidth = child.getMeasuredWidth();
childHeight  = child.getMeasuredHeight(); 
2.累加子控件的宽度,判断是否当前子控件是否需要换行,需要换行,重新累加子控件的宽度,累加高度
3.遍历结束,设置布局控件的高度
setMeasuredDimension(width, height); 
重写onLayout方法:计算并设置每个子控件的位置
遍历布局控件中所有子控件,计算设置每个子控件的位置childLeft, childTop
child.layout(childLeft , childTop,childLeft+childWidth, childTop+ childHeight); 
具体的代码实现
Android UI 代码实现:可换行的布局控件
小结
