本文主要是实现一个ViewGroup容器,并实现在内部自由放置FloatingActionButton,与各种FloatingActionButton开源库不同的是只侧重基础的实现,但实际效果还算美观。
效果图如下所示
首先,我们先实现一个类似于竖直排布的线性布局的ViewGroup,创建一个FloatingActionButtonMenu类集成ViewGroup
第一步 获得父类的arginLayoutParams,这里直接使用系统自带attrs就可以了,要注意的是方法返回值必须为ViewGroup.LayoutParams,否则在运行时会报错,这与我们直接按ctrl+o选择的结果不一样。
@Override
public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
Log.d(tag, "generateLayoutParams");
return new MarginLayoutParams(getContext(), attrs);
}
第二步,重写onMeasure方法,这一步主要时得到我们实现的ViewGroup最后所占的空间,属性中match_parent与wrap_parent所对应的分别是MeasureSpec.EXACTLY和MeasureSpec.AT_MOST
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 获得此ViewGroup上级容器为其推荐的宽和高,以及计算模式
// 所得既为设置match_parent时的大小
Log.d(tag, "onMeasure");
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
// 计算出所有的childView的宽和高
measureChildren(widthMeasureSpec, heightMeasureSpec);
// 记录如果是wrap_content是设置的宽和高
int childCount = getChildCount();
MarginLayoutParams layoutParms = null;