背景可自动填充屏幕宽度flowlayout

本文介绍了一种特殊的FlowLayout,其特点是背景能够自动填充屏幕宽度,以实现良好的展示效果。无论包含多少个标签,它们都会始终占据一行。文章通过代码示例详细解释了如何实现这一功能。
摘要由CSDN通过智能技术生成

前几天转载了一个项目中经常会用到的flowlayout,大神写的很详细,需要了可以去看看,今天再分享一个不一样的flowlayout,背景可自动填充屏幕宽度,展示效果较好,可以先看下


如图不管几个标签总是占满一行,下面就看看是如何自定义的注释很详细就直接粘代码了:

public class FlowLayout extends ViewGroup{
    public static final int DEFAULT_SPACING = 20;
    /** 横向间隔 */
    private int mHorizontalSpacing = DEFAULT_SPACING;
    /** 纵向间隔 */
    private int mVerticalSpacing = DEFAULT_SPACING;
    /** 是否需要布局,只用于第一次 */
    boolean mNeedLayout = true;
    /** 当前行已用的宽度,由子View宽度加上横向间隔 */
    private int mUsedWidth = 0;
    /** 代表每一行的集合 */
    private final List<Line> mLines = new ArrayList<Line>();
    private Line mLine = null;
    /** 最大的行数 */
    private int mMaxLinesCount = Integer.MAX_VALUE;

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

    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() {
        UiUtils.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                requestLayout();
            }
        });
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int sizeWidth = View.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; </
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值