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>
相关文章推荐
- Android内存管理
- Android 简单实现ListView顶部悬浮效果
- Android高效加载大图、多图解决方案,有效避免程序OOM
- 深入浅出 - Android系统移植与平台开发(八)- Android系统的本地服务
- Android 图片压缩也即生成缩略图方法
- 怎么去掉工程中无用的so包(Realm的坑)
- 在Android上面如何使用带有心跳检测的Socket
- Android jni helloworld
- android 基础之配置文件
- Android Studio常见错误归纳
- Launcher3--加载流程
- 【技术分享】Android应用安全开发之浅谈加密算法的坑
- Android录音功能Android Studio实现
- Android命令Monkey压力测试,详解
- 深入浅出 - Android系统移植与平台开发(七)- Android系统的启动
- Android WebView JS交互 混淆打包需要注意的问题
- Android中使用Handler造成内存泄露的分析和解决
- Android实际开发问题11_数字密码输入器
- Android 自定义View 分区域监听 回调
- Android加载大图