流式布局

来源:互联网 发布:淘宝网ipad保护套 编辑:程序博客网 时间:2024/06/03 22:50
//定义初始化集合
//存储所有子Viewprivate List<List<View>> mAllChildViews = new ArrayList<>();//每一行的高度private List<Integer> mLineHeight = new ArrayList<>();
@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    //父控件传进来的宽度和高度以及对应的测量模式    int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);    int modeWidth = MeasureSpec.getMode(widthMeasureSpec);    int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);    int modeHeight = MeasureSpec.getMode(heightMeasureSpec);    //如果当前ViewGroup的宽高为wrap_content的情况    int width = 0;//自己测量的 宽度    int height = 0;//自己测量的高度    //记录每一行的宽度和高度    int lineWidth = 0;    int lineHeight = 0;    //获取子view的个数    int childCount = getChildCount();    for(int i = 0;i < childCount; i ++){        View child = getChildAt(i);        //测量子View的宽和高        measureChild(child, widthMeasureSpec, heightMeasureSpec);        //得到LayoutParams        MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();        //View占据的宽度        int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;        //View占据的高度        int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;        //换行时候        if(lineWidth + childWidth > sizeWidth){            //对比得到最大的宽度            width = Math.max(width, lineWidth);            //重置lineWidth            lineWidth = childWidth;            //记录行高            height += lineHeight;            lineHeight = childHeight;        }else{//不换行情况            //叠加行宽            lineWidth += childWidth;            //得到最大行高            lineHeight = Math.max(lineHeight, childHeight);        }        //处理最后一个子View的情况        if(i == childCount -1){            width = Math.max(width, lineWidth);            height += lineHeight;        }    }    //wrap_content    setMeasuredDimension(modeWidth == MeasureSpec.EXACTLY ? sizeWidth : width,            modeHeight == MeasureSpec.EXACTLY ? sizeHeight : height);    super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean b, int l, int i1, int i2, int i3) {    mAllChildViews.clear();    mLineHeight.clear();    //获取当前ViewGroup的宽度    int width = getWidth();    int lineWidth = 0;    int lineHeight = 0;    //记录当前行的view    List<View> lineViews = new ArrayList<View>();    int childCount = getChildCount();    for(int i = 0;i < childCount; i ++){        View child = getChildAt(i);        MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();        int childWidth = child.getMeasuredWidth();        int childHeight = child.getMeasuredHeight();        //如果需要换行        if(childWidth + lineWidth + lp.leftMargin + lp.rightMargin > width){            //记录LineHeight            mLineHeight.add(lineHeight);            //记录当前行的Views            mAllChildViews.add(lineViews);            //重置行的宽高            lineWidth = 0;            lineHeight = childHeight + lp.topMargin + lp.bottomMargin;            //重置view的集合            lineViews = new ArrayList();        }        lineWidth += childWidth + lp.leftMargin + lp.rightMargin;        lineHeight = Math.max(lineHeight, childHeight + lp.topMargin + lp.bottomMargin);        lineViews.add(child);    }    //处理最后一行    mLineHeight.add(lineHeight);    mAllChildViews.add(lineViews);    //设置子View的位置    int left = 0;    int top = 0;    //获取行数    int lineCount = mAllChildViews.size();    for(int i = 0; i < lineCount; i ++){        //当前行的views和高度        lineViews = mAllChildViews.get(i);        lineHeight = mLineHeight.get(i);        for(int j = 0; j < lineViews.size(); j ++){            View child = lineViews.get(j);            //判断是否显示            if(child.getVisibility() == View.GONE){                continue;            }            MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();            int cLeft = left + lp.leftMargin;            int cTop = top + lp.topMargin;            int cRight = cLeft + child.getMeasuredWidth();            int cBottom = cTop + child.getMeasuredHeight();            //进行子View进行布局            child.layout(cLeft, cTop, cRight, cBottom);            left += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;        }        left = 0;        top += lineHeight;    }}/** 159.     * 与当前ViewGroup对应的LayoutParams 160.     */@Overridepublic LayoutParams generateLayoutParams(AttributeSet attrs) {            // TODO Auto-generated method stub        return new MarginLayoutParams(getContext(), attrs);    }
//acitivity
private liushi mFlowLayout;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mFlowLayout = (liushi) findViewById(R.id.liu);    initChildViews();}private String mNames[] = {        "welcome","android","TextView",        "apple","jamy","kobe bryant",        "jordan","layout","viewgroup",        "margin","padding","text",        "name","type","search","logcat",        "杨超傻逼","杨超傻逼","杨超傻逼"        ,"杨超傻逼","杨超傻逼"};private void initChildViews() {    // TODO Auto-generated method stub    ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(            LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);    lp.leftMargin = 20;    lp.rightMargin = 20;    lp.topMargin = 10;    lp.bottomMargin = 10;    for(int i = 0; i < mNames.length; i ++){        TextView view = new TextView(this);        view.setText(mNames[i]);        view.setTextColor(Color.WHITE);        view.setBackgroundDrawable(getResources().getDrawable(R.drawable.textview_bg));        mFlowLayout.addView(view,lp);    }}
//布局
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">    <solid android:color="#666666" />       <corners android:radius="10dp" />       <padding          android:left="5dp"         android:right="5dp"          android:top="5dp"          android:bottom="5dp"       /></shape>