`
dengyin2000
  • 浏览: 1223689 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android FlowLayout

阅读更多
https://github.com/ApmeM/android-flowlayout  使用这个类库。



import android.content.Context;

import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 *
 * @author RAW
 */
public class FlowLayout extends ViewGroup {
    private final static int PAD_H = 2, PAD_V = 2; // Space between child views.
    private int mHeight;

    public FlowLayout(Context context) {
        super(context);
    }

    public FlowLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        assert (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED);
        final int width = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();
        int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();
        final int count = getChildCount();
        int xpos = getPaddingLeft();
        int ypos = getPaddingTop();
        int childHeightMeasureSpec;
        if(MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST)
            childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST);
        else
            childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
        mHeight = 0;
        for(int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if(child.getVisibility() != GONE) {
                child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), childHeightMeasureSpec);
                final int childw = child.getMeasuredWidth();
                mHeight = Math.max(mHeight, child.getMeasuredHeight() + PAD_V);
                if(xpos + childw > width) {
                    xpos = getPaddingLeft();
                    ypos += mHeight;
                }
                xpos += childw + PAD_H;
            }
        }
        if(MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) {
            height = ypos + mHeight;
        } else if(MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {
            if(ypos + mHeight < height) {
                height = ypos + mHeight;
            }
        }
        height += 5; // Fudge to avoid clipping bottom of last row.
        setMeasuredDimension(width, height);
    } // end onMeasure()

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        final int width = r - l;
        int xpos = getPaddingLeft();
        int ypos = getPaddingTop();
        for(int i = 0; i < getChildCount(); i++) {
            final View child = getChildAt(i);
            if(child.getVisibility() != GONE) {
                final int childw = child.getMeasuredWidth();
                final int childh = child.getMeasuredHeight();
                if(xpos + childw > width) {
                    xpos = getPaddingLeft();
                    ypos += mHeight;
                }
                child.layout(xpos, ypos, xpos + childw, ypos + childh);
                xpos += childw + PAD_H;
            }
        }
    } // end onLayout()
}
分享到:
评论
1 楼 zyzzsky 2013-11-15  
  谢谢!

相关推荐

    Android Flowlayout:LinearLayout内部控件自动换行

    这时,`Android Flowlayout`应运而生。 Flowlayout是一种自定义的布局,它是LinearLayout的一个扩展,主要功能是支持子视图自动换行。这个自定义布局使得开发者能够更灵活地处理大量需要在屏幕上排列的控件,尤其...

    Android FlowLayout流式布局实现详解

    在Android开发中,流式布局(FlowLayout)是一种常见的布局方式,它允许子视图(views)按照特定的方向(通常是水平或垂直)排列,当一行或一列填满时自动换行。这种布局非常适合用于创建类似网格或者卡片视图的效果...

    Android代码-android-flowlayout

    android-flowlayout A very convenient and powerful flow layout created by Lan. minSdkVersion 11 Dependencies latest version see it as an icon in the beginning of the README file. gradle compile '...

    Android流式布局FlowLayout

    在Android开发中,布局管理器是构建...总之,`FlowLayout`是一个实用的自定义布局,为Android开发提供了更多的布局解决方案,尤其是在需要灵活排版和自动换行的场景下。理解和熟练使用它可以极大地提升应用的用户体验。

    美观的自定义选择标签FlowLayout外加支持左中右对齐以及滚动等功能_图文的源码

    安卓(android)选标签,很多都是做的FlowLayout瀑布流+ToggleButton的方式,因为它做tag比较符合现在的选择需要,不过支持左中右内容对齐外加滚动的可能没有实现,所以我给补齐,当然技术越来越新,可以考虑使用...

    Android代码-FlowLayout

    FlowLayout is an opensource Android library that alows developers to easily integrate flow layout into their app. FlowLayout is an layout that display its children in multiple rows depending on their ...

    Android Material FlowLayout简单使用

    在本主题中,我们将深入探讨如何在Android项目中简单使用Material Design的FlowLayout。 首先,引入Material Design库是使用FlowLayout的前提。在`build.gradle`模块文件中添加依赖: ```groovy dependencies { ...

    FlowLayout流式布局(仿热门标签)

    在本教程中,我们将深入探讨如何在Android中实现`FlowLayout`,以及其背后的原理和用法。 首先,`FlowLayout`并不是Android SDK内置的布局,因此我们需要自己创建一个自定义的布局类来实现这个功能。`FlowLayout`的...

    android 自定义view流式布局

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且复杂的UI组件。本篇文章将深入探讨如何实现一个自定义的“流式布局”(Flow Layout),这是一种能够自动调整子视图(child views...

    android 流式布局 flowlayout

    在Android开发中,流式布局(FlowLayout)是一种非常实用的布局方式,尤其适用于展示元素数量不确定,且需要根据屏幕尺寸自适应布局的情况。它的工作原理是像流水一样,当一行排列满后,会自然地换行到下一行继续...

    Android流式布局FlowLayout详解

    在Android开发中,流式布局(FlowLayout)是一种常用的布局方式,尤其在商城类应用中,用于实现选择属性的功能。在本文中,我们将深入探讨FlowLayout的工作原理以及如何在项目中使用它。 FlowLayout可以被视为一个...

    Android-Android流式布局FlowLayout实现关键字标签

    在"Android-Android流式布局FlowLayout实现关键字标签"这个主题中,我们将深入探讨如何在Android项目中创建并使用FlowLayout。首先,我们需要了解FlowLayout的基本原理: 1. **FlowLayout类的创建**: 自定义...

    android Textview 伸缩效果

    在Android开发中,TextView是用于显示单行或多行文本的常用组件。在许多应用场景中,我们可能希望TextView能够根据内容动态调整其高度,以展示全部文本,而不是简单地用省略号来代替超出部分。标题"android TextView...

    Android_实例_利用RadioButton实现分类筛选

    在Android开发中,RadioButton是用户界面(UI)设计中一种常用的组件,用于创建单选按钮。这类组件通常用于提供一组可选项,用户只能选择其中的一个。在这个实例中,“利用RadioButton实现分类筛选”意味着我们将...

    Android 实现FlowLayout流式布局(热门标签)

    public class FlowLayout extends ViewGroup { protected DataSetObserver mDataSetObserver; private FlowBaseAdapter mAdapter; /** * 所有的子view按行存储 */ private final List&lt;List&gt; mAllChildViews; ...

    android 实现FlowLayout 流线布局(自定义ViewGroup)

    [快速理解android View的测量onMeasure()与MeasureSpec](http://blog.csdn.net/double2hao/article/details/51553703) ###2、Layoutparams以及MarginLayoutParams [Android开发:LayoutParams的用法]...

    recyclerview实现flowlayout效果

    在Android开发中,RecyclerView是一个非常重要的组件,它用于展示可滚动的数据列表,具有高度的可定制性和性能优化。本教程将详细介绍如何利用RecyclerView实现类似FlowLayout的效果,即元素可以在一行内水平排列,...

Global site tag (gtag.js) - Google Analytics