返回顶部
首页 > 资讯 > 精选 >Android中怎么实现一个瀑布流控件
  • 338
分享到

Android中怎么实现一个瀑布流控件

android 2023-05-30 19:05:09 338人浏览 独家记忆
摘要

本篇文章给大家分享的是有关Android中怎么实现一个瀑布流控件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体如下:public class FlowL

本篇文章给大家分享的是有关Android中怎么实现一个瀑布流控件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

具体如下:

public class FlowLayout extends ViewGroup {    public int mHorizontolSpace = Util.getDimen(R.dimen.top_padding);    public int mVerticalSpace = Util.getDimen(R.dimen.top_padding);    private List<Line> mLines = new ArrayList<Line>();    private Line mCurrentLine;    private int mCurrentUseWidth = 0;    private int parentWidthSize;  private int parentHeightSize;  public FlowLayout(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);  }  public FlowLayout(Context context, AttributeSet attrs) {    super(context, attrs);  }  public FlowLayout(Context context) {    super(context);  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    //0.先清空行集合里的数据    clear();    //1.得到父viewGroup的模式与大小    int parentWidthMode = MeasureSpec.getMode(widthMeasureSpec);//    parentWidthSize = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();    int parentHeightMode = MeasureSpec.getMode(heightMeasureSpec);    parentHeightSize = MeasureSpec.getSize(heightMeasureSpec) - getPaddingBottom() - getPaddingTop();        //2.得到每个孩子的模式    int childWidthMode = parentWidthMode == MeasureSpec.EXACTLY ? MeasureSpec.EXACTLY : parentWidthMode;    int childHeightMode = parentHeightMode == MeasureSpec.EXACTLY ? MeasureSpec.EXACTLY : parentHeightMode;    //3.根据模式得到子控件的大小    int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthMode, parentWidthSize);    int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeightMode, parentHeightSize);    //得到子view的个数    int count = getChildCount();    //创建新的行    mCurrentLine = new Line();    for (int i = 0; i < count; i++) {      View childView = getChildAt(i);      //4.测量每个孩子      childView.measure(childWidthMeasureSpec, childHeightMeasureSpec);      //5.得到测量后的孩子的宽高      int childMeasureWidth = MeasureSpec.getSize(childWidthMeasureSpec);      //int childMeasureHeight = MeasureSpec.getSize(childHeightMeasureSpec);      //6.得到此行使用的宽度      mCurrentUseWidth += childMeasureWidth;      //7.判断此行的宽度是否大于父控件的宽度,如果大于则换行      if (mCurrentUseWidth > parentWidthSize) {        //8.如果当前的子view的宽度大于父容器的宽度,强行把这个view添加的集合里        if (mCurrentLine.getChildCount()<1) {          mLines.add(mCurrentLine);         }        //9.换行        newLine();      }else {        //8.把当前子view添加到行里        mCurrentLine.addChild(childView);        //9.添加间隔        mCurrentUseWidth += mHorizontolSpace;        if (mCurrentUseWidth > parentWidthSize) {          //10.换行          newLine();        }      }    }    //11.如果集合里没有添加当前行,则把当前添加到集合    if (!mLines.contains(mCurrentLine)) {      mLines.add(mCurrentLine);    }    //12.设置富容器的总宽高    int parentWidth = parentWidthSize + getPaddingLeft() + getPaddingRight();    int parentHeight = (mLines.size()-1) * mVerticalSpace + getPaddingBottom() + getPaddingTop();    for(Line line : mLines){      //得到所以line的高度      parentHeight += line.getHeight();    }    //13.resolveSize表示哪个高度合适,就用哪个    setMeasuredDimension(parentWidth, resolveSize(parentHeightSize, parentHeight));      }    private void newLine() {    //a.先把当前的行添加到集合    mLines.add(mCurrentLine);    //b.创建新的一行    mCurrentLine = new Line();    //c.新行里的使用的行必须设置为0    mCurrentUseWidth = 0;  }  public void clear() {    mLines.clear();    mCurrentLine = null;    mCurrentUseWidth = 0;  }  @Override  protected void onLayout(boolean changed, int l, int t, int r, int b) {    //15.得到每个line孩子的左上角的坐标    int left = l + getPaddingLeft();    int top = t + getPaddingTop();    //现在容器里只有line是子孩子    for (int i = 0; i < mLines.size(); i++) {      Line line = mLines.get(i);      //16.把分配位置给line去处理      line.layout(left, top);      //17.设置第一行后的其它行的top数值      top += line.getHeight() + mVerticalSpace;    }  }    private class Line{        private int mWidth = 0;        private int mHeight = 0;        int mChildPdding = 0;    private List<View> children = new ArrayList<View>();    public void addChild(View childView) {      children.add(childView);      //取得之view里最高的高度      if (childView.getMeasuredHeight() > mHeight) {        mHeight = childView.getMeasuredHeight();      }      //18.得到行宽度      mWidth += childView.getMeasuredWidth();    }        public void layout(int left, int top) {      //18.得到行宽度      mWidth += mHorizontolSpace * (children.size() -1);      //19.得到剩余的宽度大小      //int padding = getMeasuredWidth() - mWidth;      int padding = parentWidthSize - mWidth;      if (padding > 0) {        mChildPdding = padding / children.size();      }      // getWidth()view显示的时候大小,如果view没显示,这个值就为0,步包括隐藏的部分, getMeasuredWidth()控件实际大小,包括隐藏的部分      //一般来说 getMeasuredWidth() > getWidth();      for (int i = 0; i < children.size(); i++) {        View child = children.get(i);        //第一种:有间隔的flow        int bottom = child.getMeasuredHeight() + top;        //20.把剩余的空间分配给每个view        int right = child.getMeasuredWidth() + left + mChildPdding;        //第二种:无间隔的flow//       int bottom = getMeasuredHeight() + top;//       int right = getMeasuredWidth() + left;        //第一个child的位置        child.layout(left, top, right, bottom);        //第二个及后面child的right        right += child.getMeasuredWidth() + mHorizontolSpace + mChildPdding;      }    }        public int getChildCount() {      if (children != null) {        return children.size();      }      return 0;    }    public int getHeight() {      return mHeight;    }  }}

使用方法:

public class TopFragment extends Fragment{  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    ScrollView scrollView = new ScrollView(getActivity());    FlowLayout layout = new FlowLayout(getActivity());    layout.setBackgroundDrawable(Util.getDrawable(R.drawable.list_item_bg));    int padding = Util.getDimen(R.dimen.top_padding);    layout.setPadding(padding, padding, padding, padding);    GradientDrawable pressDrawable = DrawableUtil.createDrawable(0xffcecece);    for (int i = 0; i < mDatas.size(); i++) {      mTextView = new TextView(getActivity());      mTextView.setText(mDatas.get(i));      GradientDrawable randomDrawable = DrawableUtil.createRandomDrawable();      StateListDrawable stateListDrawable = DrawableUtil.createStateDrawable(pressDrawable, randomDrawable);      mTextView.setBackgroundDrawable(stateListDrawable);      mTextView.setTextColor(Color.WHITE);      int left = Util.px2dip(7);      int top = Util.px2dip(4);      int right = Util.px2dip(7);      int bottom = Util.px2dip(4);      mTextView.setPadding(left, top, right, bottom);      mTextView.setTag(mDatas.get(i));      mTextView.setOnClickListener(this);      layout.addView(mTextView, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, - 2));    }    scrollView.addView(layout);    }    return scrollView;}

工具类:

public class DrawableUtil {    public static GradientDrawable createRandomDrawable(){    GradientDrawable drawable = new GradientDrawable();    drawable.setCornerRadius(Util.px2dip(5));    Random random = new Random();    int red = random.nextInt(200) + 20;    int green = random.nextInt(200) + 20;    int blue = random.nextInt(200) + 20;    int color = Color.rgb(red, green, blue);    drawable.setColor(color);    return drawable;  }        public static GradientDrawable createDrawable(int color){      GradientDrawable drawable = new GradientDrawable();      drawable.setCornerRadius(Util.px2dip(5));      drawable.setColor(color);      return drawable;  }    public static StateListDrawable createStateDrawable(Drawable press, Drawable nORMal){    StateListDrawable drawable = new StateListDrawable();    //按下    drawable.addState(new int[]{android.R.attr.state_pressed}, press);    //正常    drawable.addState(new int[]{}, normal);    return drawable;  }}

以上就是Android中怎么实现一个瀑布流控件,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: Android中怎么实现一个瀑布流控件

本文链接: https://lsjlt.com/news/220559.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中怎么实现一个瀑布流控件
    本篇文章给大家分享的是有关Android中怎么实现一个瀑布流控件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体如下:public class FlowL...
    99+
    2023-05-30
    android
  • 使用CSS3怎么实现一个瀑布流布局
    使用CSS3怎么实现一个瀑布流布局?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。掌握点:column-count 把div中的文本分为多少列column-width 规定列宽c...
    99+
    2023-06-08
  • Android中FlowLayout组件实现瀑布流效果
    目录FlowLayout实现关键步骤:1、创建一个view继承自ViewGroup2、重写并实现onMeasure方法3、重写并实现onLayout方法总结纸上得来终觉浅,绝知此事要...
    99+
    2024-04-02
  • 怎么实现瀑布流布局
    本篇文章给大家分享的是有关怎么实现瀑布流布局,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、JS 实现瀑布流思路分析瀑布流布局的特点是等宽不等高。为了让最后一行的差距最小,从...
    99+
    2023-06-09
  • JavaScript瀑布流怎么实现
    这篇文章主要介绍“JavaScript瀑布流怎么实现”,在日常操作中,相信很多人在JavaScript瀑布流怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript瀑布流怎么实现”的疑惑有所...
    99+
    2023-06-29
  • Android中FlowLayout组件如何实现瀑布流效果
    这篇文章将为大家详细讲解有关Android中FlowLayout组件如何实现瀑布流效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。纸上得来终觉浅,绝知此事要躬行。动手实践是学习的最好的方式,对于自定义V...
    99+
    2023-06-26
  • uniapp瀑布流布局怎么实现
    要实现uniapp中的瀑布流布局,可以使用uniapp提供的mescroll组件,通过配置该组件实现瀑布流效果。以下是实现瀑布流布局...
    99+
    2024-03-08
    uniapp
  • Android怎么使用RecyclerView实现瀑布流界面
    今天小编给大家分享一下Android怎么使用RecyclerView实现瀑布流界面的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-05
  • 纯css怎么实现瀑布流
    这篇文章主要介绍了纯css怎么实现瀑布流,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。   1.multi-column多列布局实现瀑布流...
    99+
    2024-04-02
  • 小程序中怎么实现瀑布流布局
    这篇文章将为大家详细讲解有关小程序中怎么实现瀑布流布局,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。widthFix:宽度不变,高度自动变化,保持原图宽高比不变。配合column-count...
    99+
    2023-06-19
  • vue+uniapp瀑布流布局怎么实现
    这篇“vue+uniapp瀑布流布局怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue+uniapp瀑布流布局怎么...
    99+
    2023-07-05
  • 怎么在小程序中如何实现一个可截断的瀑布流组件
    这期内容当中小编将会给大家带来有关怎么在小程序中如何实现一个可截断的瀑布流组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。瀑布流是一种常见的布局方式,实现的方式有许多,比如直接分两列,然后控制在左右两列...
    99+
    2023-06-28
  • 利用Android从0到1实现一个流布局控件
    目录前言演示效果:实现步骤:核心点:总结前言 流布局在在项目中还是会时不时地用到的,比如在搜索历史记录,分类,热门词语等可用标签来显示的,都可以设计成流布局的展示方式。这里我从0到1...
    99+
    2024-04-02
  • 怎么在HTML5中使用canvas实现一个瀑布流文字效果
    今天就跟大家聊聊有关怎么在HTML5中使用canvas实现一个瀑布流文字效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。代码如下:<!doctype html>...
    99+
    2023-06-09
  • 原生js怎么实现瀑布流布局
    这篇文章主要介绍原生js怎么实现瀑布流布局,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!用js实现瀑布流布局以及通过模拟的数据加载图片,已标记注释效果如图:<!DOCTYPE&...
    99+
    2024-04-02
  • HTML中如何实现瀑布流布局
    这篇文章将为大家详细讲解有关HTML中如何实现瀑布流布局,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。第一种方式:使用JavaScript:<!DOCTYPE&nb...
    99+
    2024-04-02
  • 怎么用JS实现网页瀑布流布局
    这篇文章主要介绍怎么用JS实现网页瀑布流布局,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JS是什么JS是JavaScript的简称,它是一种直译式的脚本语言,其解释器被称为JavaScript引擎,是浏览器的一部分...
    99+
    2023-06-14
  • 如何利用Android从0到1实现一个流布局控件
    小编给大家分享一下如何利用Android从0到1实现一个流布局控件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言流布局在在项目中还是会时不时地用到的,比如在搜索历史记录,分类,热门词语等可用标签来显示的,都可以设计成流...
    99+
    2023-06-20
  • 如何在css中实现瀑布流布局
    这期内容当中小编将会给大家带来有关如何在css中实现瀑布流布局,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.multi-column多列布局实现瀑布流先简单的讲下multi-column相关的部分属性...
    99+
    2023-06-15
  • Python中怎么创建一个瀑布图
    这期内容当中小编将会给大家带来有关Python中怎么创建一个瀑布图,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。创建图表首先,执行标准的输入,并确保IPython能显示matplot图。import&nb...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作