1.首先介绍下view.onlayout方法

屏幕快照 2020-05-27 下午1.48.05.png
ViewGroup流式布局
2.MyViewGroup.java
package com.liu.test;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.RequiresApi;
//自定义ViewGroup 类似线性布局
public class MyViewGroup extends ViewGroup {
int maxWidth, height;
int left, top;
int lastTop;
public MyViewGroup(Context context) {
super(context);
}
public MyViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//如果wrap_content 获取最大宽度
//需要累加所有高度
maxWidth = 0;
height = 0;
int child = getChildCount();
View childView;
MarginLayoutParams marginLayoutParams;
for (int i = 0; i < child; i++) {
childView = getChildAt(i);
measureChild(childView, widthMeasureSpec, heightMeasureSpec);
marginLayoutParams = (MarginLayoutParams) childView.getLayoutParams();
maxWidth = marginLayoutParams.width + marginLayoutParams.leftMargin + marginLayoutParams.rightMargin;
height += marginLayoutParams.height + marginLayoutParams.topMargin + marginLayoutParams.bottomMargin;
}
if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) {
maxWidth = MeasureSpec.getSize(widthMeasureSpec);
} else {
maxWidth = Math.min(MeasureSpec.getSize(widthMeasureSpec), maxWidth);
}
if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) {
height = MeasureSpec.getSize(heightMeasureSpec);
} else {
height = Math.min(MeasureSpec.getSize(heightMeasureSpec), height);
}
setMeasuredDimension(maxWidth, height);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int child = getChildCount();
View childView;
MarginLayoutParams marginLayoutParams;
lastTop = 0;
for (int i = 0; i < child; i++) {
childView = getChildAt(i);
marginLayoutParams = (MarginLayoutParams) childView.getLayoutParams();
final int right = childView.getMeasuredWidth() + marginLayoutParams.leftMargin;
final int bottom = childView.getMeasuredHeight();
left = marginLayoutParams.leftMargin;
top = marginLayoutParams.topMargin;
lastTop += top;
childView.layout(left, lastTop, right, lastTop + bottom);
lastTop += bottom + marginLayoutParams.bottomMargin;
}
}
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new MarginLayoutParams(getContext(), attrs);
}
}
4.截图

屏幕快照 2020-05-27 下午1.54.05.png
网友评论