您的位置:首页 > 移动开发 > Android开发

Android 流水布局

2016-07-01 15:14 495 查看
Android 流水布局重写ViewGroup 
代码如下
package com.test.tool;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import com.te33.yelaiban.R;

/**
* FlowLayout is much more like a {@link android.widget.LinearLayout}, but it can automatically
* separate the widgets wrapped in it into multiple lines just like the water flow.
*
* Inspired by {@see http://hzqtc.github.io/2013/12/android-custom-layout-flowlayout.html}
*
* @author liangfeizc {@see http://www.liangfeizc.com}
*/
public class FlowLayout extends ViewGroup {

private static final int DEFAULT_HORIZONTAL_SPACING = 5;
private static final int DEFAULT_VERTICAL_SPACING = 5;

private int mVerticalSpacing;
private int mHorizontalSpacing;

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

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

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlowLayout);
try {
mHorizontalSpacing = a.getDimensionPixelSize(
R.styleable.FlowLayout_horizontal_spacing, DEFAULT_HORIZONTAL_SPACING);
mVerticalSpacing = a.getDimensionPixelSize(
R.styleable.FlowLayout_vertical_spacing, DEFAULT_VERTICAL_SPACING);
} finally {
a.recycle();
}
}

public void setHorizontalSpacing(int pixelSize) {
mHorizontalSpacing = pixelSize;
}

public void setVerticalSpacing(int pixelSize) {
mVerticalSpacing = pixelSize;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int myWidth = resolveSize(0, widthMeasureSpec);

int paddingLeft = getPaddingLeft();
int paddingTop = getPaddingTop();
int paddingRight = getPaddingRight();
int paddingBottom = getPaddingBottom();

int childLeft = paddingLeft;
int childTop = paddingTop;

int lineHeight = 0;
int childHeightT = 0;

// Measure each child and put the child to the right of previous child
// if there's enough room for it, otherwise, wrap the line and put the child to next line.
for (int i = 0, childCount = getChildCount(); i < childCount; ++i) {
View child = getChildAt(i);
if (child.getVisibility() != View.GONE) {
measureChild(child, widthMeasureSpec, heightMeasureSpec);
} else {
continue;
}

int childWidth = child.getMeasuredWidth();
int childHeight = child.getMeasuredHeight();

lineHeight = Math.max(childHeight, lineHeight);

if (childLeft + childWidth + paddingRight > myWidth) {
childLeft = paddingLeft;
childTop += mVerticalSpacing + lineHeight;
lineHeight = childHeight;
} else {
childLeft += childWidth + mHorizontalSpacing;
}
childHeightT=childHeight;
}

//        int wantedHeight = childTop + lineHeight + paddingBottom;
int wantedHeight = childTop + childHeightT*2 + lineHeight + paddingBottom;

setMeasuredDimension(myWidth, resolveSize(wantedHeight, heightMeasureSpec));
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int myWidth = r - l;

int paddingLeft = getPaddingLeft();
int paddingTop = getPaddingTop();
int paddingRight = getPaddingRight();

int childLeft = paddingLeft;
int childTop = paddingTop;

int lineHeight = 0;

for (int i = 0, childCount = getChildCount(); i < childCount; ++i) {
View childView = getChildAt(i);

if (childView.getVisibility() == View.GONE) {
continue;
}

int childWidth = childView.getMeasuredWidth();
int childHeight = childView.getMeasuredHeight();

lineHeight = Math.max(childHeight, lineHeight);

if (childLeft + childWidth + paddingRight > myWidth) {
childLeft = paddingLeft;
childTop += mVerticalSpacing + lineHeight;
lineHeight = childHeight;
}

childView.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight);
childLeft += childWidth + mHorizontalSpacing;
}
}
}
布局中的代码
<com.test.tool.FlowLayout
android:id="@+id/flow_layout"
flowlayout:vertical_spacing="10dp"
flowlayout:horizontal_spacing="10dp"
android:layout_gravity="center"
android:layout_marginRight="5dp"
android:layout_marginLeft="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="流水布局流水布局"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="流水布局流水布局"/>
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="流水布局"/>
</com.test.tool.FlowLayout>
style中的的代码
<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="FlowLayout">        <attr name="horizontal_spacing" format="dimension" />        <attr name="vertical_spacing" format="dimension" />    </declare-styleable></resources>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: