package com.example.dell.text;
import android.content.Context;
import android.text.Layout;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by DELL on 2018/6/8.
*/
public class FlowLayout extends ViewGroup {
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) {
measureChildren(widthMeasureSpec, heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(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();
if (childWidth>widthSize){
throw new IllegalArgumentException("子布局宽不能大于FlowLayout宽度");
}
childHeight=childView.getMeasuredHeight();
if (lineWidth+childWidth>widthSize){
width = widthSize;
int prelineHeight = lineHeight;
totalHeight += prelineHeight;
lineHeight = childHeight;
lineWidth = childWidth;
}else{
lineWidth += childWidth;
lineHeight = Math.max(lineHeight,childHeight);
width = Math.max(width,lineWidth);
}
if (i == getChildCount()-1 ){
totalHeight += lineHeight;
height=totalHeight;
}
}
width = widthMode == MeasureSpec.EXACTLY ? widthSize:width;
height = heightMode == MeasureSpec.EXACTLY ? heightSize:height;
setMeasuredDimension(width,height);
}
@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 (lineWidth + childWidth>getMeasuredWidth()){
totalHeight += childHeight;
lineWidth = 0;
LayoutChildView(childView, lineWidth,totalHeight,lineWidth + childWidth, totalHeight + childHeight);
lineHeight = childHeight;
lineWidth = childWidth;
}else{
LayoutChildView(childView, lineWidth,totalHeight,lineWidth + childWidth, totalHeight + childHeight);
lineWidth += childWidth;
lineHeight=Math.max(lineHeight,childHeight);
}
}
}
public void LayoutChildView(View childView, int l, int t, int r, int b) {
childView.layout(l,t,r,b);
}
}
import android.content.Context;
import android.text.Layout;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by DELL on 2018/6/8.
*/
public class FlowLayout extends ViewGroup {
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) {
measureChildren(widthMeasureSpec, heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(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();
if (childWidth>widthSize){
throw new IllegalArgumentException("子布局宽不能大于FlowLayout宽度");
}
childHeight=childView.getMeasuredHeight();
if (lineWidth+childWidth>widthSize){
width = widthSize;
int prelineHeight = lineHeight;
totalHeight += prelineHeight;
lineHeight = childHeight;
lineWidth = childWidth;
}else{
lineWidth += childWidth;
lineHeight = Math.max(lineHeight,childHeight);
width = Math.max(width,lineWidth);
}
if (i == getChildCount()-1 ){
totalHeight += lineHeight;
height=totalHeight;
}
}
width = widthMode == MeasureSpec.EXACTLY ? widthSize:width;
height = heightMode == MeasureSpec.EXACTLY ? heightSize:height;
setMeasuredDimension(width,height);
}
@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 (lineWidth + childWidth>getMeasuredWidth()){
totalHeight += childHeight;
lineWidth = 0;
LayoutChildView(childView, lineWidth,totalHeight,lineWidth + childWidth, totalHeight + childHeight);
lineHeight = childHeight;
lineWidth = childWidth;
}else{
LayoutChildView(childView, lineWidth,totalHeight,lineWidth + childWidth, totalHeight + childHeight);
lineWidth += childWidth;
lineHeight=Math.max(lineHeight,childHeight);
}
}
}
public void LayoutChildView(View childView, int l, int t, int r, int b) {
childView.layout(l,t,r,b);
}
}