流式布局,优点就是父类布局能够自己主动的推断子孩子是不是须要换行,什么时候须要换行,能够做到网页版的标签的效果。

今天就是简单的做了自己定义的流式布局。

详细效果:









原理:

事实上非常easy,Measure  Layout。仅仅须要这两个步骤就能够搞定了。全然的手动去Measure  Layout。

我们看一下代码。

解释就在代码里面做凝视了,由于使用为知笔记写的博客。格式不符合代码格式。

大家能够看详细的源代码。最后又源代码下载地址。

1.Measure  測量 

 

         @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        

        int widthSize = MeasureSpec.getSize(widthMeasureSpec);

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);

        

        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        

        int lineHeight = 0 ;

        int lineWidth = 0 ; 

        

        int width = 0 ; 

        int height = 0 ; 

        

        int childCount = getChildCount();

        

        Log.i("Test", getPaddingLeft() + "==right="  +getPaddingRight());

        

        for (int i = 0; i < childCount; i++) {

            View childView = getChildAt(i);

            measureChild(childView, widthMeasureSpec, heightMeasureSpec);

            MarginLayoutParams params = (MarginLayoutParams)                                       childView.getLayoutParams();

            

            int childWidth = childView.getMeasuredWidth() + params.leftMargin + params.rightMargin ; 

            

            int childHeight  = childView.getMeasuredHeight() + params.topMargin + params.bottomMargin ; 

            

            

            if ((lineWidth + childWidth ) > widthSize - getPaddingLeft() - getPaddingRight() ) {

                width = Math.max(width, lineWidth);

                lineWidth = childWidth ; 

                height += lineHeight ; 

                lineHeight = childHeight; 

            }else {

                lineWidth += childWidth ; 

                lineHeight = Math.max(lineHeight, childHeight);

            }

            

            

            if (i  == childCount-1) {

                width = Math.max(width, lineWidth);

                height += lineHeight ; 

            }

        }

        

        height += getPaddingTop() + getPaddingBottom() ;

        

        setMeasuredDimension(widthMode == MeasureSpec.EXACTLY?widthSize:width, 

                heightMode == MeasureSpec.EXACTLY?

heightSize:height);

    }









2.onLayout  布局

 @Override

    protected void onLayout(boolean a, int l, int t, int r, int b) {

        

        childViewList.clear(); 

        

        int childCount = getChildCount() ; 

        int width = getWidth();

        int lineWidth = 0 ;

        int lineHeight = 0 ; 

        

        List<View> lineViews = new ArrayList<View>();

        for (int i = 0; i < childCount; i++) {

            View childView = getChildAt(i);

            MarginLayoutParams params = (MarginLayoutParams) childView.getLayoutParams();

            

            int childWidth = childView.getMeasuredWidth() + params.leftMargin + params.rightMargin ; 

            int childHeight = childView.getMeasuredHeight() + params.topMargin +  params.bottomMargin  ;

            

            if (lineWidth + childWidth > width - getPaddingLeft() - getPaddingRight()) {

                

                childViewList.add(lineViews);

                lineViews = new ArrayList<View>();

                

                if (i == 0 ) {

                    lineHeight += getPaddingTop() ; 

                }else if (i== childCount - 1) {

                    lineHeight += getPaddingBottom() ; 

                }

                this.lineHeight.add(lineHeight);

                

                lineHeight = 0 ; 

                lineWidth = 0 ; 

            }

            

            lineWidth += childWidth; 

            lineHeight = Math.max(lineHeight, childHeight) ;

            

            lineViews.add(childView);

        }

        

        childViewList.add(lineViews);

        this.lineHeight.add(lineHeight);

        

        int left = getPaddingLeft() ;

        int top = getPaddingTop(); 

        

        for (int i = 0; i < childViewList.size(); i++) {

            lineViews = childViewList.get(i);

            for (int j = 0; j < lineViews.size(); j++) {

                View childView = lineViews.get(j);

                

                MarginLayoutParams params = (MarginLayoutParams) childView.getLayoutParams();

                

                int lc = left + params.leftMargin ; 

                int tc = top + params.topMargin ; 

                int rc = lc + childView.getMeasuredWidth()  ; 

                int bc = tc + childView.getMeasuredHeight() ; 

                

                childView.layout(lc,tc,rc,bc);

                

                left += params.leftMargin + childView.getMeasuredWidth() + params.rightMargin ; 

            }

            

            left =  getPaddingLeft() ;

            top += this.lineHeight.get(i) ; 

        }

    }





代码下载地址:

 百度网盘:  http://pan.baidu.com/s/1hqH1kFU

Android自己定义之流式布局的更多相关文章

  1. Android流式布局实现

    查看我的所有开源项目[开源实验室] 欢迎增加我的QQ群:[201055521],本博客client下载[请点击] 摘要 新项目用到了一种全新布局----Android标签流式布局的功能,正好一直说给大 ...

  2. Android 自动换行流式布局的RadioGroup

    效果图 用法 使用FlowRadioGroup代替RadioGroup 代码 import android.content.Context; import android.util.Attribute ...

  3. Android 自定义View修炼-Android中常见的热门标签的流式布局的实现

    一.概述:在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧(源码下载在下面最后给出哈) 类似的 ...

  4. Android控件进阶-自定义流式布局和热门标签控件

    技术:Android+java   概述 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧,类 ...

  5. 含有过滤功能的android流式布局

    FilterFlowLayout 含有过滤功能的流式布局, 參考FlowLayout 能够去除宽度不在范围(比例或真实值)内的子view 能够设置最大行数 能够加入组件间水平间距 能够加入行间距 系统 ...

  6. 【Android - 自定义View】之自定义可滚动的流式布局

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 FlowLayout ,继承自ViewGroup类: (2)在这个自定义View中,用户可以放入所有继承自View类的视图,这个 ...

  7. android -------- 流式布局,支持单选、多选等

    最近开发中有流式标签这个功能,网上学了下,来分享一下 Android 流式布局,支持单选.多选等,适合用于产品标签等. 效果图: 用法: dependencies { compile 'com.hym ...

  8. android流式布局、待办事项应用、贝塞尔曲线、MVP+Rxjava+Retrofit、艺术图片应用等源码

    Android精选源码 android模仿淘宝首页效果源码 一款艺术图片应用,采用T-MVVM打造 Android MVP + RxJava + Retrofit项目 android流式布局实现热门标 ...

  9. Android自定义之流式布局

    流式布局,好处就是父类布局可以自动的判断子孩子是不是需要换行,什么时候需要换行,可以做到网页版的标签的效果.今天就是简单的做了自定义的流式布局. 具体效果: 原理: 其实很简单,Measure  La ...

随机推荐

  1. [BZOJ2337][HNOI2011]XOR和路径(概率+高斯消元)

    直接不容易算,考虑拆成位处理. 设f[i]表示i到n的期望路径异或和(仅考虑某一位),则$f[y]=\sum\limits_{exist\ x1\to y=0}\frac{f[x1]}{d[x1]}+ ...

  2. 【动态规划】【斜率优化】CDOJ1689 分序列

    斜率优化裸题,模型可以看http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html #include<cstdio> # ...

  3. 2.1(java编程思想笔记)位移操作

    java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...

  4. mac 下做csv文件的读取与生成的 遇到的坑

    mac下每次读取就把所有的行都读出来了,其实windows下是正常的. 错误原因是逗号的识别方式不对

  5. HDU 3537 Daizhenyang's Coin(博弈,翻硬币)

    Daizhenyang's Coin Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. java自带的jvm分析工具

    http://domark.iteye.com/blog/1924302   这段时间觉得很有必要对java的内存分析工具进行熟悉,这样以后出现机器负载较高,或者反应很慢的时候,我就可以查找原因了.上 ...

  7. java多线程之Concurrent包

    1.在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题. 2.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的 ...

  8. pyqt5生成的APP制作DMG

    http://blog.csdn.net/wudj810818/article/details/70557284 1.环境 Mac OS Python3.5 PyQt5 2.所需工具 Pyinstal ...

  9. Android批量图片载入经典系列——Volley框架实现多布局的新闻列表

    一.问题描写叙述 Volley是Google 2013年公布的实现Android平台上的网络通信库,主要提供网络通信和图片下载的解决方式,比方曾经从网上下载图片的步骤可能是这种流程: 在ListAda ...

  10. Android获取wifi MAC,关闭的wifi不能获取

    最近一直在尝试着在Android上通过ndk用C++获取本机MAC地址,但是用ioctl(SIOCGIFHWADDR)时,一直返回值小于0,即获取不到接口信息.刚开始我以为是自己漏掉了哪些访问权限,所 ...