动态加载流逝布局

1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/et_main"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <Button
            android:id="@+id/btn_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="添加" />
    </LinearLayout>

    <com.jensen.flowlayout.FlowLayout
        android:id="@+id/fl_main"
        android:layout_width="match_parent"
        android:layout_height="200dp">

    </com.jensen.flowlayout.FlowLayout>

</LinearLayout>
package com.jensen.flowlayout;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

/**
 * @Author JenSenLeung.
 * @Time 2018/6/30 下午 2:53.
 * @Description This is FlowLayout.
 */
public class FlowLayout extends ViewGroup {
    private static final String TAG = "FlowLayout++";

    public FlowLayout(Context context) {
        super(context);
    }

    public FlowLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public FlowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        //测量所有孩子的宽高
        measureChildren(widthMeasureSpec, heightMeasureSpec);

        //int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);//AT-MOST
        //int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        /*int width = 0;
        int height = 0;
        int lineWidth = 0;
        //int lineHeight = 0;
        int totalHeight = 0;//累加的高度
        View childView;
        int childWidth = 0;
        int childHeight = 0;


        for (int i = 0; i < getChildCount(); i++) {
            childView = getChildAt(i);
            childWidth = childView.getMeasuredWidth();
            childHeight = childView.getMeasuredHeight();

            //
            if (childWidth > widthSize) {
                Log.d(TAG, "onMeasure: 太大了");
            }

            //测量布局的宽
            //换行/不换行
            if (childWidth + lineWidth > widthSize) {
                //换行
                width = widthSize;
                totalHeight += childHeight;

                //第一个
                //lineHeight = childHeight;
                lineWidth = childWidth;
            } else {
                //不换行

                lineWidth += childWidth;

                //lineHeight = Math.max(lineHeight, childHeight);

                width = Math.max(width, lineWidth);
            }
*//*            //测量高度
            if (i == getChildCount() - 1) {
                totalHeight += childHeight;
                height = totalHeight;
            }*//*
        }

        width = widthMode == MeasureSpec.EXACTLY ? widthSize : width;
        height = heightMode == MeasureSpec.EXACTLY ? heightSize : height;*/

        setMeasuredDimension(widthSize, heightSize);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int lineWidth = 0;
        //int lineHeight = 0;
        int totalHeight = 0;//累加的高度
        View childView;
        int childWidth = 0;
        int childHeight = 0;


        for (int i = 0; i < getChildCount(); i++) {
            childView = getChildAt(i);
            childWidth = childView.getMeasuredWidth();
            childHeight = childView.getMeasuredHeight();


            //测量布局的宽
            //换行/不换行
            if (childWidth + lineWidth > getMeasuredWidth()) {
                //换行
                totalHeight += childHeight;
                lineWidth = 0;
                childViewLayout(childView, lineWidth, totalHeight, lineWidth + childWidth, totalHeight + childHeight);
                //第一个
                //lineHeight = childHeight;
                lineWidth = childWidth;
            } else {
                //不换行
                childViewLayout(childView, lineWidth, totalHeight, lineWidth + childWidth, totalHeight + childHeight);

                lineWidth += childWidth;

                //lineHeight = Math.max(lineHeight, childHeight);

            }
        }
    }

    public void childViewLayout(View childView, int l, int t, int r, int b) {
        childView.layout(l, t, r, b);
    }
}
package com.jensen.flowlayout;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText mEtMain;
    private Button mBtnMain;
    private FlowLayout mFlMain;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        mEtMain = (EditText) findViewById(R.id.et_main);
        mBtnMain = (Button) findViewById(R.id.btn_main);
        mFlMain = (FlowLayout) findViewById(R.id.fl_main);

        mBtnMain.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_main:
                submit();
                break;
        }
    }

    private void submit() {
        // validate
        String main = mEtMain.getText().toString().trim();
        if (TextUtils.isEmpty(main)) {
            Toast.makeText(this, "main不能为空", Toast.LENGTH_SHORT).show();
            return;
        } else {
            TextView textView = new TextView(getApplicationContext());
            textView.setText(main);
            textView.setTextColor(Color.BLACK);
            textView.setPadding(10, 10, 10, 10);
            mFlMain.addView(textView);
        }

        // TODO validate success, do something


    }
}

猜你喜欢

转载自blog.csdn.net/wsj19970717/article/details/80877119