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

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

详细效果:









原理:

事实上非常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. android viewpager fragment 优化 切换界面 延时加载

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 使用 碎片的 设置用户可见暗示visible hint  这个方法来做到. hint 是 ...

  2. BZOJ 1707 [Usaco2007 Nov]tanning分配防晒霜(扫描线+贪心+优先队列)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1707 [题目大意] 每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值 防晒霜的作 ...

  3. 【二分查找】POJ2456-Aggressive cows

    [题目大意] 有N间牛舍和M头牛,告诉你每个牛舍的位置,求出两头牛之间最小距离的最大值. [思路] 二分判断两头牛之间的最小距离d,通过贪心法进行验证. #include<iostream> ...

  4. Z-Stack协议栈网络号与信道号的设置

    1.网络号设置 默认是:-DZDAPP_CONFIG_PAN_ID=0xFFFF 代表的是随机选择一个网络号,并加入此网络,可以将0xffff改成4位数字,如图所示. 2.信道号的设置 这个地方在网络 ...

  5. Sql实现行列转换

    从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据.今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据. ...

  6. [转] Moran's I

    李旭, Matlab: Moran's I原文地址 Introduction In statistics, Moran's I is a measure of spatial autocorrelat ...

  7. C语言嵌入式系统编程修炼

    C语言嵌入式系统编程修炼 2008-08-19 作者:宋宝华 来源:天极网 C语言嵌入式系统编程修炼之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程 ...

  8. pgsql常用命令

    连接数据库, 默认的用户和数据库是postgres psql -U user -d dbname 切换数据库,相当于mysql的use dbname \c dbname 列举数据库,相当于mysql的 ...

  9. json字符串跟objective-c模型的相互转换

    在当今这样一个各种openapi开放的年代,在熟悉的语言下面找到一款得心应手的将json字符串转换成模型的库可以说是十分必要的,在NET平台下,我们有Newtonsoft.Json这个库使用,那么在i ...

  10. ​Mac触控板常用的手势操作

    ​Mac触控板常用的手势操作 学习了:http://topbook.cc/archives/151   一个手指直接点击,类似Windows中鼠标左键功能,同时在苹果Safari等浏览器中,这个手势还 ...