zoukankan      html  css  js  c++  java
  • Android下自动折行 效果

    关于自动折行,网上面已经有很多实现代码了,我在之前也实现过,最近再次用上这个效果,发现之前自己写的代码很丑陋,于是进行了重构,现在把代码放出来。

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.LinearLayout;
    
    
    public class FlowLinearLayout extends LinearLayout {
        public FlowLinearLayout(Context context) {
            super(context);
        }
    
        public FlowLinearLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int maxWidth = MeasureSpec.getSize(widthMeasureSpec);
    
            int childCount = getChildCount();
            int measuredX = 0;
            int measuredY = 0;
            int raw = 1;
            int maxRowItemHeight = 0;
            for (int i = 0; i < childCount; i++) {
                View child = getChildAt(i);
                if (child.getVisibility() == View.GONE) {
                    return;
                }
                child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
                int width = child.getMeasuredWidth();
                int height = child.getMeasuredHeight();
                if (height > maxRowItemHeight) {
                    measuredY = getMeasuredY(measuredY, raw, maxRowItemHeight, height);
                    maxRowItemHeight = height;
                }
                measuredX += width;
                if (measuredX > maxWidth) {
                    measuredX = width;
                    raw++;
                    measuredY += height;
                    maxRowItemHeight = 0;
                }
            }
            measuredY += getPaddingTop() + getPaddingBottom();
            setMeasuredDimension(maxWidth, measuredY);
        }
    
        private int getMeasuredY(int measuredY, int raw, int maxRowItemHeight, int height) {
            if (raw == 1) {
                measuredY = height;
            } else {
                measuredY += height - maxRowItemHeight;
            }
            return measuredY;
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int rightBorder, int b) {
    
            int childCount = getChildCount();
            int maxRowItemHeight = 0;
            int measuredX = getPaddingLeft();
            int measuredY;
            int raw = 1;
            for (int i = 0; i < childCount; i++) {
                View child = getChildAt(i);
                if (child.getVisibility() == View.GONE) {
                    return;
                }
                int width = child.getMeasuredWidth();
                int height = child.getMeasuredHeight();
                if (height > maxRowItemHeight) {
                    maxRowItemHeight = height;
                }
                measuredX += width;
                if (measuredX > rightBorder) {
                    measuredX = getPaddingLeft() + width;
                    raw++;
                }
                measuredY = getPaddingTop() + raw * maxRowItemHeight;
                child.layout(measuredX - width, measuredY - maxRowItemHeight, measuredX,
                        measuredY);
            }
        }
    
    }
    

    总共代码100行,实现了显示效果如下图

      

    小遗憾是没有写magin,所以子元素很紧凑,大家可以自己写一个magrin参数,添加上对于的效果。

  • 相关阅读:
    c语言 12
    c语言中用结构体表示点的坐标,并计算两点之间的距离
    c语言 12
    c语言中结构体数组
    c语言 12-3
    c语言 12-2
    codevs3164 质因数分解
    codevs4438 YJQ Runs Upstairs
    codevs4439 YJQ Requires Food
    codevs4437 YJQ Arranges Sequences
  • 原文地址:https://www.cnblogs.com/sunzhuo1228/p/4902798.html
Copyright © 2011-2022 走看看