美文网首页
自定义ViewGroup 实现线性布局的vertical功能

自定义ViewGroup 实现线性布局的vertical功能

作者: Android刘东 | 来源:发表于2020-05-27 13:54 被阅读0次

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

相关文章

网友评论

      本文标题:自定义ViewGroup 实现线性布局的vertical功能

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