全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android利用FlexboxLayout轻松实现流动布局

前言

相信大家应该都有所体会,在以前我们要实现流动性布局,比较繁琐,Google开源了一个项目叫FlexboxLayout,相信大家都不陌生。下面我们来学习一下FlexboxLayout基础知识,并通过一个案例来加深理解。如果你对FlexboxLayout很熟悉,请忽略本文。

一、什么是 Flexbox

简单来说 Flexbox 是属于web前端领域CSS的一种布局方案,是2009年W3C提出了一种新的布局方案,可以响应式地实现各种页面布局,并且 React Native 也是使用的 Flex 布局。

我们可以简单的理解为 Flexbox 是CSS领域类似 Linearlayout 的一种布局,但比 Linearlayout 要强大的多。

二、 什么是 FlexboxLayout?

我们在 Android 开发中使用 Linearlayout + RelativeLayout 基本可以实现大部分复杂的布局,但是Google就想了,有没有类似 Flexbox 的一个布局呢?这使用起来一个布局就可以搞定各种复杂的情况了,于是 FlexboxLayout 就应运而生了。

所以 FlexboxLayout 是针对 Android 平台的,实现类似 Flexbox 布局方案的一个开源项目

我们先看看官方Demo的效果图

开源地址:https://github.com/google/flexbox-layout

本地下载:点击这里

三、使用方式

使用方式很简单,只需要添加以下依赖:

compile 'com.google.android:flexbox:0.2.2'

在xml布局中我们可以这样使用

 <com.google.android.flexbox.FlexboxLayout
  android:id="@+id/flexbox_layout"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  app:flexWrap="wrap">
  <TextView
  android:id="@+id/tv1"
  android:layout_width="120dp"
  android:layout_height="80dp"
  app:layout_flexBasisPercent="50%" />
  <TextView
  android:id="@+id/tv2"
  android:layout_width="80dp"
  android:layout_height="80dp"
  app:layout_alignSelf="center"/>
  <TextView
  android:id="@+id/tv3"
  android:layout_width="160dp"
  android:layout_height="80dp"
  app:layout_alignSelf="flex_end"/>
 </com.google.android.flexbox.FlexboxLayout>

代码中可以这样使用

FlexboxLayout flexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout);
flexboxLayout.setFlexDirection(FlexboxLayout.FLEX_DIRECTION_COLUMN);
View view = flexboxLayout.getChildAt(0);
FlexboxLayout.LayoutParams lp = (FlexboxLayout.LayoutParams) view.getLayoutParams();
lp.order = -1;
lp.flexGrow = 2;
view.setLayoutParams(lp);

我们来看看要模仿的布局

下面我们来实现它,先来看最终实现的效果:


实现方法如下:

1. 新建activity_flow.xml布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <com.google.android.flexbox.FlexboxLayout
  android:id="@+id/flexbox_layout"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  app:flexWrap="wrap" />
</RelativeLayout>

布局很简单,只有一个FlexboxLayout 因为我们需要动态创建它的item,所以就在这里固定写TextView了

2. 新建ActivityFlow Activity,填充数据源

String[] tags = {"婚姻育儿", "散文", "设计", "上班这点事儿", "*天堂", "大学生活", "美人说", "运动和健身", "工具癖", "生活家", "程序员", "想法", "短篇小说", "美食", "教育", "心理", "奇思妙想", "美食", "摄影"};
  flexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout);
  for (int i = 0; i < tags.length; i++) {
   Book model = new Book();
   model.setId(i);
   model.setName(tags[i]);
   flexboxLayout.addView(createNewFlexItemTextView(model));
  }

其中Book为一个实体,这个不是关键,关键的是createNewFlexItemTextView方法

我们要动态加载FlexboxLayout其FlexItem 并且让FlexboxLayout中的item支持点击事件,因为我们需要知道用户点击了哪个专题跳转。

我们来看一下createNewFlexItemTextView方法

/**
  * 动态创建TextView
  * @param book
  * @return
  */
 private TextView createNewFlexItemTextView(final Book book) {
  TextView textView = new TextView(this);
  textView.setGravity(Gravity.CENTER);
  textView.setText(book.getName());
  textView.setTextSize(12);
  textView.setTextColor(getResources().getColor(R.color.colorAccent));
  textView.setBackgroundResource(R.drawable.tag_states);
  textView.setTag(book.getId());
  textView.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
    Log.e(TAG, book.getName());
   }
  });
  int padding = Util.dpToPixel(this, 4);
  int paddingLeftAndRight = Util.dpToPixel(this, 8);
  ViewCompat.setPaddingRelative(textView, paddingLeftAndRight, padding, paddingLeftAndRight, padding);
  FlexboxLayout.LayoutParams layoutParams = new FlexboxLayout.LayoutParams(
    ViewGroup.LayoutParams.WRAP_CONTENT,
    ViewGroup.LayoutParams.WRAP_CONTENT);
  int margin = Util.dpToPixel(this, 6);
  int marginTop = Util.dpToPixel(this, 16);
  layoutParams.setMargins(margin, marginTop, margin, 0);
  textView.setLayoutParams(layoutParams);
  return textView;
 }

其他有关Book实体和Util类,也贴出来一下

Book实体

public class Book {
 private int id;
 private String name;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public Book() {
 }
}

Util工具类

public class Util {
 public static int pixelToDp(Context context, int pixel) {
  DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
  return pixel < 0 ? pixel : Math.round(pixel / displayMetrics.density);
 }
 public static int dpToPixel(Context context, int dp) {
  DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
  return dp < 0 ? dp : Math.round(dp * displayMetrics.density);
 }
}

这样关于流动布局[FlexboxLayout],我们就实现完成了,是不是很简单。

总结

以上就是关于Android轻松搞定流动布局(FlexboxLayout)的全部内容了,希望本文的内容对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# flexboxlayout  # android流动布局  # android  # Android startActivityForResult实例详解  # Android在Fragment中实现监听触摸事件  # Android 使用FragmentTabhost代替Tabhost  # Android数据持久化之File机制分析  # Android数据持久化之Preferences机制详解  # Android 如何本地加载pdf文件  # android手机端与PC端使用adb forword通信  # Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法  # Android 7.0行为变更 FileUriExposedException解决方法  # 很简单  # 开源  # 我们可以  # 的是  # 都不  # 本地下载  # 提出了  # 点击这里  # 想了  # 来看看  # 你对  # 只有一个  # 应运而生  # 人说  # 只需要  # 可以实现  # 跳转  # 短篇小说  # 谢谢大家  # 来实现 


相关文章: 盘锦网站制作公司,盘锦大洼有多少5G网站?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何快速建站并高效导出源代码?  如何通过FTP服务器快速搭建网站?  实例解析angularjs的filter过滤器  如何快速搭建虚拟主机网站?新手必看指南  建站三合一如何选?哪家性价比更高?  如何获取上海专业网站定制建站电话?  如何在香港服务器上快速搭建免备案网站?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  智能起名网站制作软件有哪些,制作logo的软件?  制作公司内部网站有哪些,内网如何建网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  微信推文制作网站有哪些,怎么做微信推文,急?  营销式网站制作方案,销售哪个网站招聘效果最好?  如何通过西部数码建站助手快速创建专业网站?  建站主机选哪种环境更利于SEO优化?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  家具网站制作软件,家具厂怎么跑业务?  自助网站制作软件,个人如何自助建网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  建站之星收费标准详解:套餐费用及年费价格表一览  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何在橙子建站中快速调整背景颜色?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  哈尔滨网站建设策划,哈尔滨电工证查询网站?  建站之星如何实现网站加密操作?  兔展官网 在线制作,怎样制作微信请帖?  建站主机SSH密钥生成步骤及常见问题解答?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  ,石家庄四十八中学官网?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  再谈Python中的字符串与字符编码(推荐)  网站制作需要会哪些技术,建立一个网站要花费多少?  如何配置IIS站点权限与局域网访问?  建站之星后台管理:高效配置与模板优化提升用户体验  如何通过宝塔面板实现本地网站访问?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  制作网站外包平台,自动化接单网站有哪些?  如何通过FTP空间快速搭建安全高效网站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  建站之星后台密码遗忘?如何快速找回?  红河网站制作公司,红河事业单位身份证如何上传?  建站之星后台管理如何实现高效配置?  如何自定义建站之星网站的导航菜单样式?  Swift中switch语句区间和元组模式匹配 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。