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

作者:爱开发 时间:2021-06-24 02:41:53 

前言

相信大家应该都有所体会,在以前我们要实现流动性布局,比较繁琐,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的效果图

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

开源地址: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);

我们来看看要模仿的布局

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

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

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

实现方法如下:

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],我们就实现完成了,是不是很简单。

来源:http://www.jianshu.com/p/217b3f4a1a18

标签:android,flexboxlayout,流动布局
0
投稿

猜你喜欢

  • 解决Android WebView拦截url,视频播放加载失败的问题

    2023-10-24 02:22:25
  • SpringMVC之AbstractAnnotationConfigDispatcherSer解读

    2023-06-21 21:42:32
  • Android中方法数超限问题与启动优化详解

    2023-03-05 17:55:41
  • Hibernate中的多表查询及抓取策略

    2022-02-22 18:58:28
  • Java程序开发环境配置图文教程

    2022-05-24 08:55:16
  • C#实现获取一年中是第几个星期的方法

    2023-12-04 02:02:46
  • Android绘制圆形百分比加载圈效果

    2023-07-16 17:23:38
  • Mybatis Plus select 实现只查询部分字段

    2022-07-23 18:51:32
  • C# ConfigHelper 辅助类介绍

    2023-11-20 21:53:09
  • Android 6.0 扫描不到 Ble 设备需开启位置权限的方法

    2021-09-15 04:59:25
  • Android PopupWindow 点击外面取消实现代码

    2022-02-04 20:52:05
  • JVM内存参数配置详解

    2022-05-20 19:17:57
  • Android Studio安装配置方法图文详细教程

    2023-01-08 23:10:16
  • vscode设置Fira_Code字体及改变编辑器字体、背景颜色的代码详解

    2023-05-22 21:00:17
  • java开发BeanUtils类解决实体对象间赋值

    2022-08-25 06:31:25
  • 使用 CliWrap 让C#中的命令行交互(推荐)

    2023-04-19 01:31:51
  • C#实现文本转语音功能

    2021-07-07 20:20:54
  • 深入了解JAVA HASHMAP的死循环

    2023-11-28 00:32:12
  • Android Studio kotlin生成编辑类注释代码

    2023-06-16 12:03:20
  • Android用MVP实现一个简单的类淘宝订单页面的示例

    2022-09-20 06:21:01
  • asp之家 软件编程 m.aspxhome.com