djwdj 发表于 2018-1-31 11:20

全对齐布局(上下左右都对齐) (基于流式布局)demo



先上核心代码:
class ll extends ViewGroup
{
        int n=2,H,V,max;

        ll(Context c){super(c);}

        void set(int n, int h, int v)
        {
                this.n = n;
                this.H = h;
                this.V = v;
        }
       
        @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
      int maxWidth = MeasureSpec.getSize(widthMeasureSpec);
                max = maxWidth - getPaddingLeft() - getPaddingRight();
      int x = 0;
      int y = getPaddingTop() + getPaddingBottom();
      int row = 0;
      for (int i = 0; i < getChildCount(); i++)
                {
                        View v = getChildAt(i);
            if (v.getVisibility() != View.GONE)
                        {
                v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
                int height = v.getMeasuredHeight();
                x += 1;
                y = row * height + height;
                if (x > n)
                                {
                  x = 1;
                  row++;
                  y = row * height + height;
                }
            }
      }
                y += (row + 2) * V;
      setMeasuredDimension(maxWidth, y);
    }

        @Override
        protected void onLayout(boolean p1, int l, int t, int r, int b)
        {
                l = getPaddingLeft();
                t = getPaddingTop();
                int x = l;
      int y = 0;
      int row = 1;
      for (int i = 0; i < getChildCount(); i++)
                {
                        View v = getChildAt(i);
            if (v.getVisibility() != View.GONE)
                        {
                int width = (max - H) / n - H;
                int height = v.getMeasuredHeight();
                x += width + H;
                y = row * (height + V);
                if (x > l + max)
                                {
                  x = l + H + width;
                  row++;
                  y = row * (height + V);
                }
                                v.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
                                                  MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
                v.layout(x - width, y - height, x, y);
            }
      }
        }
}
核心代码基于尘哥bamboy
再上调用的
                ll f=new ll(this);
                f.setPadding(28,8,28,8);
                f.set(3,32,32);//一行的排布数,横间距,纵间距

ufo8636278 发表于 2018-1-31 11:37

Moira-Luke 发表于 2018-1-31 11:42

先收藏起来,以后说不定就用到了,感谢分享

huste 发表于 2018-2-1 13:25

谢谢楼主分享
页: [1]
查看完整版本: 全对齐布局(上下左右都对齐) (基于流式布局)demo