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

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

详细效果:









原理:

事实上非常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. ZOJ 3057 Beans Game 博弈论 sg函数

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3057 典型的sg函数,数据范围卡得真好啊 代码 #include<c ...

  2. BZOJ 1433 [ZJOI2009]假期的宿舍(网络流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1433 [题目大意] 在校学生有自己的床,外校的则没有,如果两个同学相互认识,则可以借用 ...

  3. [AGC027F]Grafting

    题意:给定两棵树,一次操作形如:选一个未被选过的叶子,改变它的一条出边,问能否在第一棵树上做一些操作使得它变成第二棵树,如果能则询问最小操作次数 如果答案不是$n$,那么存在一个点$r$没有被选中过 ...

  4. Codeforces Round #344 (Div. 2) D. Messenger kmp

    D. Messenger 题目连接: http://www.codeforces.com/contest/631/problem/D Description Each employee of the ...

  5. mysqldumper

    介绍 MySQL自身的mysqldump工具支持单线程工作,依次一个个导出多个表,没有一个并行的机,这就使得它无法迅速的备份数据. mydumper作为一个实用工具,能够良好支持多线程工作,可以并行的 ...

  6. 剖析ASP.NET Core(Part 4)- 调用MVC中间件(译)

    原文:https://www.stevejgordon.co.uk/invoking-mvc-middleware-asp-net-core-anatomy-part-4 发布于:2017年5月环境: ...

  7. iOS:quartz2D绘图(显示绘制在PDF上的图片)

    quart2D既可以用来绘制图像到pdf上,也可以从pdf上读取图像并显示出来.在使用这种方式之前,还有一种方式可以用来读取显示pdf上的图像,即使用UIWebView网页视图控件- (void)lo ...

  8. XSD-学习总结

    1.代码详细分析 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/X ...

  9. java 中PriorityQueue优先级队列使用方法

    1.前言 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果想实现按照自己的意愿进行优 ...

  10. ckeditor 触发事件(案例)

    CKEDITOR.instances.positionDesc.on('blur', function() { $("#positionDescMSg").text("& ...