android 流式布局 ,其实这个有点烂大街,之所以说下,主要是因为RadioGroup这个东西,缺少的就是自适应的能力,不能换行搞的很烦,其实核心的代码也就是流式布局的onMeasure和 onLayout 。测量和分布。
代码: github github地址
简单说下RadioGroup的自动换行
看一下核心的代码 onMeasure

 int widthSize = MeasureSpec.getSize(widthMeasureSpec);        int widthMode = MeasureSpec.getMode(widthMeasureSpec);        int heightSize = MeasureSpec.getSize(heightMeasureSpec);        int heightMode = MeasureSpec.getMode(heightMeasureSpec);        //调用ViewGroup的方法,测量子view        measureChildren(widthMeasureSpec, heightMeasureSpec);        //最大的宽        int maxWidth = 0;        //累计的高        int totalHeight = 0;        //当前这一行的累计行宽        int lineWidth = 0;        //当前这行的最大行高        int maxLineHeight = 0;        //用于记录换行前的行宽和行高        int oldHeight;        int oldWidth;        int count = getChildCount();        //假设 widthMode和heightMode都是AT_MOST        for (int i = 0; i < count; i++) {            View child = getChildAt(i);            MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams();            oldHeight = maxLineHeight;            //当前最大宽度            oldWidth = maxWidth;            int deltaX = child.getMeasuredWidth() + params.leftMargin + params.rightMargin;            if (lineWidth + deltaX + getPaddingLeft() + getPaddingRight() > widthSize) {//如果折行,height增加                //和目前最大的宽度比较,得到最宽。不能加上当前的child的宽,所以用的是oldWidth                maxWidth = Math.max(lineWidth, oldWidth);                //重置宽度                lineWidth = deltaX;                //累加高度                totalHeight += oldHeight;                //重置行高,当前这个View,属于下一行,因此当前最大行高为这个child的高度加上margin                maxLineHeight = child.getMeasuredHeight() + params.topMargin + params.bottomMargin;                Log.v(TAG, "maxHeight:" + totalHeight + "---" + "maxWidth:" + maxWidth);            } else {                //不换行,累加宽度                lineWidth += deltaX;                //不换行,计算行最高                int deltaY = child.getMeasuredHeight() + params.topMargin + params.bottomMargin;                maxLineHeight = Math.max(maxLineHeight, deltaY);            }            if (i == count - 1) {                //前面没有加上下一行的搞,如果是最后一行,还要再叠加上最后一行的最高的值                totalHeight += maxLineHeight;                //计算最后一行和前面的最宽的一行比较                maxWidth = Math.max(lineWidth, oldWidth);            }        }        //加上当前容器的padding值        maxWidth += getPaddingLeft() + getPaddingRight();        totalHeight += getPaddingTop() + getPaddingBottom();        setMeasuredDimension(widthMode == MeasureSpec.EXACTLY ? widthSize : maxWidth,                heightMode == MeasureSpec.EXACTLY ? heightSize : totalHeight);

onLayout

int count = getChildCount();        //pre为前面所有的child的相加后的位置        int preLeft = getPaddingLeft();        int preTop = getPaddingTop();        //记录每一行的最高值        int maxHeight = 0;        for (int i = 0; i < count; i++) {            View child = getChildAt(i);            MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams();            //r-l为当前容器的宽度。如果子view的累积宽度大于容器宽度,就换行。            if (preLeft + params.leftMargin + child.getMeasuredWidth() + params.rightMargin + getPaddingRight() > (r - l)) {                //重置                preLeft = getPaddingLeft();                //要选择child的height最大的作为设置                preTop = preTop + maxHeight;                maxHeight = getChildAt(i).getMeasuredHeight() + params.topMargin + params.bottomMargin;            } else { //不换行,计算最大高度                maxHeight = Math.max(maxHeight, child.getMeasuredHeight() + params.topMargin + params.bottomMargin);            }            //left坐标            int left = preLeft + params.leftMargin;            //top坐标            int top = preTop + params.topMargin;            int right = left + child.getMeasuredWidth();            int bottom = top + child.getMeasuredHeight();            //为子view布局            child.layout(left, top, right, bottom);            //计算布局结束后,preLeft的值            preLeft += params.leftMargin + child.getMeasuredWidth() + params.rightMargin;        }

这个是RadioGroup的写法。如果是自定义的一个FlowLayout.大致写法一样,只是可以引入一个LayoutPrarms 来简化计算。
代码已经都上传到了github上。

更多相关文章

  1. android网格布局
  2. android布局时,左侧宽度固定而右侧textview高度变化,怎么9png实现
  3. Android 布局文件属性讲解
  4. Android SQLite详解及示例代码
  5. ANDROID L——Material Design详解(主题和布局)
  6. Android中打印代码的调用层次
  7. 【android】在Eclipse在联想引jar包源代码
  8. Android 2.3.3 安卓系统 源代码 在Eclipse查看方法
  9. Android proguard代码混淆

随机推荐

  1. Android(安卓)4.1 WebView 页面整体缩放
  2. Android一些好用的类或方法
  3. Android Handler 四个使用实例 及Handler
  4. android 百分比布局percentFrameLayout,p
  5. Android使用Java Web服务器作为中转实现
  6. Android系统启动流程(1) —— 解析init进
  7. java.lang.NoClassDefFoundError: com.go
  8. 打造android ORM框架opendroid(五)——数
  9. **Android** 基础(一)
  10. speex编解码在android上实现