
package com.rongke.mifan.jiagang.view.flowLayout;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.rongke.mifan.jiagang.R;
import com.zyf.fwms.commonlibrary.utils.AutoUtils;
import com.zyf.fwms.commonlibrary.utils.CommonUtils;
import java.util.ArrayList;
import java.util.List;
public class FlowLayout extends ViewGroup {
private List valueList=new ArrayList<>();
private OnFlowClickLisener lisener;
public static final int DEFAULT_SPACING = 20;
private int mHorizontalSpacing = DEFAULT_SPACING;
private int mVerticalSpacing = DEFAULT_SPACING;
boolean mNeedLayout = true;
private int mUsedWidth = 0;
private final List mLines = new ArrayList();
private Line mLine = null;
private int mMaxLinesCount = Integer.MAX_VALUE;
Handler handler = new Handler();
private Context context;
private boolean isMore;
public FlowLayout(Context context) {
super(context);
}
public FlowLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context, attrs);
}
public FlowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context, attrs);
}
private void initView(Context context, AttributeSet attrs) {
this.context=context;
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlowLayout);
mHorizontalSpacing = a.getInt(R.styleable.FlowLayout_horizontal_spacing, DEFAULT_SPACING);
mVerticalSpacing = a.getInt(R.styleable.FlowLayout_vertical_spacing, DEFAULT_SPACING);
}
private TextView getDefualtTextView(){
TextView textView= (TextView) View.inflate(context,R.layout.flow_text_view,null);
textView.setWidth(CommonUtils.dip2px(context,71));
textView.setHeight(CommonUtils.dip2px(context,25));
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TextView textView= (TextView) v;
int position = (int) textView.getTag();
if(textView.isSelected()){
textView.setSelected(false);
if(valueList.contains(textView.getText().toString())){
valueList.remove(textView.getText().toString());
}
}else {
if(!isMore){
resetView();
}
textView.setSelected(true);
if(!valueList.contains(textView.getText().toString())){
valueList.add(textView.getText().toString());
}
}
}
});
AutoUtils.autoTextSize(textView);
return textView;
}
private void resetView(){
valueList.clear();
for(int i=0;ifalse);
}
}
public void setView(List list,boolean isMore,OnFlowClickLisener lisener){
valueList.clear();
this.lisener=lisener;
this.isMore=isMore;
addViewList(list);
}
public interface OnFlowClickLisener{
void onClick(List valueList);
}
private void addViewList(List list) {
removeAllViews();
for(int i=0;i/**
* 水平宽度
*
* @param spacing
*/
public void setHorizontalSpacing(int spacing) {
if (mHorizontalSpacing != spacing) {
mHorizontalSpacing = spacing;
requestLayoutInner();
}
}
public void setVerticalSpacing(int spacing) {
if (mVerticalSpacing != spacing) {
mVerticalSpacing = spacing;
requestLayoutInner();
}
}
public void setMaxLines(int count) {
if (mMaxLinesCount != count) {
mMaxLinesCount = count;
requestLayoutInner();
}
}
private void requestLayoutInner() {
handler.post(new Runnable() {
@Override
public void run() {
requestLayout();
}
});
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec) - getPaddingRight() - getPaddingLeft();
int sizeHeight = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();
int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
restoreLine();
final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.getVisibility() == GONE) {
continue;
}
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(sizeWidth, modeWidth == MeasureSpec.EXACTLY ? MeasureSpec.AT_MOST : modeWidth);
int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(sizeHeight, modeHeight == MeasureSpec.EXACTLY ? MeasureSpec.AT_MOST : modeHeight);
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
if (mLine == null) {
mLine = new Line();
}
int childWidth = child.getMeasuredWidth();
mUsedWidth += childWidth;
if (mUsedWidth <= sizeWidth) {
mLine.addView(child);
mUsedWidth += mHorizontalSpacing;
if (mUsedWidth >= sizeWidth) {
if (!newLine()) {
break;
}
}
} else {
if (mLine.getViewCount() == 0) {
mLine.addView(child);
if (!newLine()) {
break;
}
} else {
if (!newLine()) {
break;
}
mLine.addView(child);
mUsedWidth += childWidth + mHorizontalSpacing;
}
}
}
if (mLine != null && mLine.getViewCount() > 0 && !mLines.contains(mLine)) {
mLines.add(mLine);
}
int totalWidth = MeasureSpec.getSize(widthMeasureSpec);
int totalHeight = 0;
final int linesCount = mLines.size();
for (int i = 0; i < linesCount; i++) {
totalHeight += mLines.get(i).mHeight;
}
totalHeight += mVerticalSpacing * (linesCount - 1);
totalHeight += getPaddingTop() + getPaddingBottom();
setMeasuredDimension(totalWidth, resolveSize(totalHeight, heightMeasureSpec));
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (!mNeedLayout || changed) {
mNeedLayout = false;
int left = getPaddingLeft();
int top = getPaddingTop();
final int linesCount = mLines.size();
for (int i = 0; i < linesCount; i++) {
final Line oneLine = mLines.get(i);
oneLine.layoutView(left, top);
top += oneLine.mHeight + mVerticalSpacing;
}
}
}
private void restoreLine() {
mLines.clear();
mLine = new Line();
mUsedWidth = 0;
}
private boolean newLine() {
mLines.add(mLine);
if (mLines.size() < mMaxLinesCount) {
mLine = new Line();
mUsedWidth = 0;
return true;
}
return false;
}
class Line {
int mWidth = 0;
int mHeight = 0;
List views = new ArrayList();
public void addView(View view) {
views.add(view);
mWidth += view.getMeasuredWidth();
int childHeight = view.getMeasuredHeight();
mHeight = mHeight < childHeight ? childHeight : mHeight;
}
public int getViewCount() {
return views.size();
}
public void layoutView(int l, int t) {
int left = l;
int top = t;
int cnull