iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何利用Android从0到1实现一个流布局控件
  • 546
分享到

如何利用Android从0到1实现一个流布局控件

2023-06-20 21:06:35 546人浏览 薄情痞子
摘要

小编给大家分享一下如何利用Android从0到1实现一个流布局控件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言流布局在在项目中还是会时不时地用到的,比如在搜索历史记录,分类,热门词语等可用标签来显示的,都可以设计成流

小编给大家分享一下如何利用Android从0到1实现一个流布局控件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

前言

流布局在在项目中还是会时不时地用到的,比如在搜索历史记录,分类,热门词语等可用标签来显示的,都可以设计成流布局的展示方式。这里我从0到1实现了一个搜索历史记录的流布局。

演示效果:

如何利用Android从0到1实现一个流布局控件

实现步骤:

创建FlowLayoutView,创建数据源,并添加各个子view。

在onMeasure方法中遍历子view,通过简单计算剩余宽度,用集合存储当前行的几个子view,再根据子view的累加高度设置自己的最终尺寸。

在onLayout方法中,遍历每一行,遍历该行的子view,依次调动layout设置子view位置。

核心点:

引入行的概念,每一行存储自己应该放置的子view。判断该行剩余空间和该子view的宽度,来决定能放入该行,还是需要新建下一行来存储。

主要代码:

public class FlowLayoutView extends ViewGroup {    private List<Row> rows = new ArrayList<>();    private int usedWidth;        private Row curRow;    private int verticalPadding = 30;    private int horizontalPadding = 40;    public FlowLayoutView(Context context) {        super(context);    }    public FlowLayoutView(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        restoreLine();  //每次重新布局,属性要初始化,避免onMeasure重复调用混乱问题        //子view设置宽高为父view大小减去padding值        int width = MeasureSpec.getSize(widthMeasureSpec);        int height = MeasureSpec.getSize(heightMeasureSpec);        int widthMode = MeasureSpec.getMode(widthMeasureSpec);        int heightMode = MeasureSpec.getMode(heightMeasureSpec);        //设置每个子view宽高,并且将每个子View归到自己的行        for (int i = 0; i < getChildCount(); i++) {            View childView = getChildAt(i);            //设置子view设置AT_MOST模式,即布局属性为wrap_content            int childWidthSpec = MeasureSpec.makeMeasureSpec(width, widthMode == MeasureSpec.EXACTLY ? MeasureSpec.AT_MOST : widthMode);            int childHeightSpec = MeasureSpec.makeMeasureSpec(height, heightMode == MeasureSpec.EXACTLY ? MeasureSpec.AT_MOST : heightMode);            childView.measure(childWidthSpec, childHeightSpec);            if (curRow == null) {                curRow = new Row();            }            //根据当前childview宽度和剩余宽度判断是否能放进当前行,放不了就要换行            if (childView.getMeasuredWidth() + horizontalPadding > width - usedWidth) {                //先换行,再放入                nextLine();            }            usedWidth += childView.getMeasuredWidth() + horizontalPadding;            curRow.addView(childView);        }        //将最后一个row加入到rows中        rows.add(curRow);        //根据子view组成的高度重设自己高度        int finalHeight = 0;        for (Row row : rows) {            finalHeight += row.height + verticalPadding;        }        setMeasuredDimension(width, finalHeight);    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        int top = 0;        //遍历每一行,将每一行子view布局        for (Row row : rows) {            row.layout(top);            top = top + row.height + verticalPadding;        }    }        private void nextLine() {        rows.add(curRow);        curRow = new Row();        usedWidth = 0;    }        private void restoreLine() {        rows.clear();        curRow = new Row();        usedWidth = 0;    }        class Row {                private List<View> childViews = new ArrayList<>();        private int height;        public void addView(View view) {            childViews.add(view);            height = view.getMeasuredHeight() > height ? view.getMeasuredHeight() : height;  //高度取最高子view的高度        }        public int getSize() {            return childViews.size();        }                public void layout(int top) {            int leftMargin = 0;            for (int i = 0; i < childViews.size(); i++) {                View view = childViews.get(i);                view.layout(leftMargin, top, leftMargin + view.getMeasuredWidth(), top + view.getMeasuredHeight());                leftMargin = leftMargin + view.getMeasuredWidth() + horizontalPadding;            }        }    }}

MainActivity代码:

public class MainActivity extends AppCompatActivity {    private FlowLayoutView flowLayoutView;    private String[] tagTextArray = new String[]{"天猫精灵", "充电台灯", "睡衣", "手表", "创意水杯", "夏天T恤男", "灯光机械键盘",            "计算机原理", "学霸笔记本", "可口可乐", "跑步机", "旅行箱", "竹浆卫生纸", "吹风机", "洗面奶", "窗帘"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init() {        flowLayoutView = findViewById(R.id.flowlayout);        TextView tvAddTag = findViewById(R.id.tv_addtag);        tvAddTag.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_tagview, null);                TextView tvContent = view.findViewById(R.id.tv_content);                tvContent.setText(tagTextArray[(int) (Math.random()*tagTextArray.length)]);                flowLayoutView.addView(view);            }        });    }}

看完了这篇文章,相信你对“如何利用Android从0到1实现一个流布局控件”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何利用Android从0到1实现一个流布局控件

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用Android从0到1实现一个流布局控件
    目录前言演示效果:实现步骤:核心点:总结前言 流布局在在项目中还是会时不时地用到的,比如在搜索历史记录,分类,热门词语等可用标签来显示的,都可以设计成流布局的展示方式。这里我从0到1...
    99+
    2024-04-02
  • 如何利用Android从0到1实现一个流布局控件
    小编给大家分享一下如何利用Android从0到1实现一个流布局控件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言流布局在在项目中还是会时不时地用到的,比如在搜索历史记录,分类,热门词语等可用标签来显示的,都可以设计成流...
    99+
    2023-06-20
  • android应用中怎么利用onLayout()实现一个流式布局
    这期内容当中小编将会给大家带来有关android应用中怎么利用onLayout()实现一个流式布局,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在onLayout方法中有四个参数,我画了一个简单的图来分清...
    99+
    2023-05-31
    android roi onlayout()
  • Android中怎么实现一个瀑布流控件
    本篇文章给大家分享的是有关Android中怎么实现一个瀑布流控件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体如下:public class FlowL...
    99+
    2023-05-30
    android
  • 如何利用Bootstrap实现瀑布流布局
    这篇文章主要介绍了如何利用Bootstrap实现瀑布流布局,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、案例介绍瀑布流是近几年流行起来的...
    99+
    2024-04-02
  • 如何在Android中利用View实现一个垂直时间轴布局
    这篇文章将为大家详细讲解有关如何在Android中利用View实现一个垂直时间轴布局,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户...
    99+
    2023-05-31
    android view roi
  • 怎么在Android应用中利用onTouchEvent实现一个滑动布局
    本篇文章给大家分享的是有关怎么在Android应用中利用onTouchEvent实现一个滑动布局,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。boolean onTouch(V...
    99+
    2023-05-31
    android ontouchevent roi
  • 怎么在Android中利用ImageView控件实现一个圆角功能
    今天就跟大家聊聊有关怎么在Android中利用ImageView控件实现一个圆角功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。创建CustomImageView 类在你的项目中(...
    99+
    2023-05-31
    android age imageview
  • 如何在Android 开发中实现一个日历控件
    这期内容当中小编将会给大家带来有关如何在Android 开发中实现一个日历控件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、主要功能支持农历、节气、常用节假日2、日期范围设置,默认支持的最大日期范围[...
    99+
    2023-05-31
    android roi
  • Android如何实现一个倒计时自定义控件
    这篇“Android如何实现一个倒计时自定义控件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android如何实现一个倒计...
    99+
    2023-06-29
  • 怎么在Android应用中利用控件实现一个对话框功能
    怎么在Android应用中利用控件实现一个对话框功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。自定义提示对话框DialogM.Builder builder&nb...
    99+
    2023-05-31
    android roi
  • 如何利用Android组件实现一个列表选择框功能
    如何利用Android组件实现一个列表选择框功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。android提供的列表选择框(Spinner)相当于web端用户...
    99+
    2023-05-31
    android roi
  • Android如何利用svg实现可缩放的地图控件
    目录序言效果实现svg地图的获取控件实现svg解析缩放源码Demo总结序言 闲来无事写了个地图控件,基于SVG。可以缩放,可拖动,可点击。SVG具有体积小,不失真的优点。而且由于保存...
    99+
    2024-04-02
  • 如何使用HTML和CSS实现一个全屏滚动布局
    随着互联网的发展,页面设计越来越注重用户体验。全屏滚动布局就是一种常用的设计方式,它能够让页面更加吸引人,并且提供了流畅的用户导航体验。如果你想学习如何使用HTML和CSS实现一个全屏滚动布局,本文将为你提供具体的代码示例和实现步骤。在开始...
    99+
    2023-10-21
    CSS html - 滚动布局 - 全屏布局 - 全屏滚动
  • 如何使用HTML和CSS实现一个导航标签布局
    导航标签布局在网页设计中非常常见,它可以让用户快速找到所需要的页面,并提高网站的导航友好度。下面将详细介绍如何使用HTML和CSS实现一个导航标签布局,并附上具体的代码示例。编写HTML结构首先,需要定义导航标签的HTML结构。可以使用无序...
    99+
    2023-10-21
    CSS html 导航标签
  • 如何使用HTML和CSS实现一个全屏遮罩布局
    首先,让我们来创建HTML结构。在HTML文件中,我们会使用一个div元素来作为遮罩的容器,并在其中添加内容,如下所示:<!DOCTYPE html> <html> <head> <meta...
    99+
    2023-10-21
    HTML布局 CSS实现 全屏遮罩
  • 如何使用HTML和CSS实现一个定宽居中布局
    在网页设计中,定宽居中布局可以让页面在不同大小的显示器上都能够保持统一的样式和排版。这种布局方式可以通过使用HTML和CSS来实现。本文将给出一个具体的示例,以演示如何使用HTML和CSS来实现一个定宽居中布局。首先,我们需要创建一个HTM...
    99+
    2023-10-21
    CSS html 定宽居中布局
  • 如何使用HTML和CSS实现一个固定头部布局
    在网页设计中,固定头部布局是一种常用的布局方式,可以使页面的顶部导航栏或标题始终保持固定位置,无论用户滚动页面的位置。本文将向您介绍如何使用HTML和CSS来实现一个简单的固定头部布局。首先,让我们创建一个基本的HTML结构。在6c04bd...
    99+
    2023-10-21
    CSS html 固定头部布局
  • 如何使用HTML和CSS实现一个全屏背景布局
    在网页设计中,全屏背景布局是一种常见且炫酷的效果,能够更好地展示网站内容,给用户带来良好的视觉体验。本文将介绍如何使用HTML和CSS实现一个全屏背景布局,并提供具体的代码示例。首先,在HTML文件中创建一个基本的布局结构。以下是一个简单的...
    99+
    2023-10-21
    HTML布局 CSS背景 全屏布局
  • 如何使用HTML和CSS实现一个详细页面布局
    HTML和CSS是创建和设计网页的基础技术,通过合理使用这两者,我们可以实现各种复杂的网页布局。本文将介绍如何使用HTML和CSS来实现一个详细页面布局,并提供具体的代码示例。创建HTML结构首先,我们需要创建一个HTML结构来放置我们的页...
    99+
    2023-10-21
    CSS样式 HTML布局 详细页面
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作