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

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

详细效果:









原理:

事实上非常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. [P2526][SHOI2001]小狗散步

    Link: P2526 传送门 Solution: 一道提示非常到位的题目 题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献 于是明显可以将原题看作询问在两个不相交点集间最多能 ...

  2. HDOJ(HDU) 3949 XOR

     Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  3. 【多重背包】CDOJ1691 这是一道比CCCC简单题经典的中档题

    #include<cstdio> #include<algorithm> using namespace std; int n,V,w[110],c[110],a[110],f ...

  4. bzoj 3900: 交换茸角

    3900: 交换茸角 Description 动物园里有 n 头麋鹿.每头麋鹿有两支茸角,每支茸角有一个重量.然而,一旦某头麋鹿上 两支茸角的重量之差过大,这头麋鹿就会失去平衡摔倒.为了不然这种悲剧发 ...

  5. JavaScript之几种创建函数的区别以及优缺点。

    工厂模式 function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = ...

  6. 我告诉你MSDN

    https://msdn.itellyou.cn/ 微软的软件,系统,官方下载

  7. Composer与laravel安装

    首先,要知道Composer是什么? Composer是PHP中用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你 ...

  8. 如何使用 DBCC MEMORYSTATUS 命令来监视 SQL Server 2005 中的内存使用情况

    https://technet.microsoft.com/en-us/solutionaccelerators/dd537566.aspx 注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完 ...

  9. winform 使用SplashScreen窗口

    SplashScreen,就是平时我们说的溅射屏幕,任何一个做过客户端程序的coder应该对它都不陌生,因为它能提升用户体验,让软件看上去更美.SplashScreenForm通常进入程序时是打开,主 ...

  10. JavaScript基础入门教程(三)

    说明 前面的两篇博客介绍了js中的基本知识中的变量类型.标识符等.这篇博客主要谈表达式以及运算符. 原始表达式 原始表达式就是表达式中最小的,不能在分割的表达式,一般指变量.常数直接量.关键字(tru ...