当前位置:网站首页>ConstraintLayout的流式布局Flow
ConstraintLayout的流式布局Flow
2022-07-05 09:41:00 【沙漠一只雕得儿得儿】
Flow流式布局
流式布局的实现方式有很多种,比如RecycleView的StaggeredGridLayoutManager
,或者自定义布局动态计算的方式
等,无论哪种实现,都不如ConstraintLayout提供的Flow流式布局
来的更灵活,更简单。
base_component_learn/ConstraintFlowActivity.java at master · buder-cp/base_component_learn · GitHub
这里我们进行动态添加,效果如下:
代码非常简单,即使用动态添加布局即可:
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.helper.widget.Flow;
import androidx.constraintlayout.widget.ConstraintLayout;
import java.util.ArrayList;
public class ConstraintFlowActivity extends AppCompatActivity {
private ConstraintLayout mainLayout;
private Flow flow;
private int[] idsss = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
private String[] strings = new String[]{ "拍案叫绝银汉迢迢暗度银汉迢汉迢迢暗度", "行云流水", "花花", "词语好词",
"如霜", "翠彤翠彤翠彤", "眉飞色舞", "梦琪", "蓉", "描写友情的词",
"优美词语集锦", "相视而笑", "笑容", "推心置腹", "喜上眉梢", "可掬", "银汉迢迢暗度", "又岂在朝朝暮暮又岂", "便胜却", "ads"};
private ArrayList<Integer> arrayList = new ArrayList<Integer>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.constraint_exercise);
mainLayout = (ConstraintLayout) LayoutInflater.from(this).inflate(R.layout.constraint_exercise, null);
setContentView(mainLayout);
for (int i = 1; i < 20; i++) {
arrayList.add(i);
mainLayout.addView(generateView(i));
}
flow = findViewById(R.id.constrain_flows);
// flow.setMaxElementsWrap(3);
// flow.setHorizontalAlign();
flow.setWrapMode(1);
flow.setReferencedIds(idsss);
}
private TextView generateView(int i) {
TextView textView = new TextView(getApplicationContext());
textView.setId(i);
textView.setPadding(12, 5, 12, 5);
textView.setTextColor(Color.BLACK);
textView.setBackgroundResource(R.drawable.vip_course_selector_bg);
textView.setText(strings[i]);
return textView;
}
}
XML代码仅包含一个flow即可:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<androidx.constraintlayout.helper.widget.Flow
android:id="@+id/constrain_flows"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="20dp"
app:layout_constraintTop_toTopOf="parent"
app:flow_horizontalGap="10dp"
app:flow_verticalGap="10dp"
app:flow_maxElementsWrap="4"
app:flow_wrapMode="aligned" />
</androidx.constraintlayout.widget.ConstraintLayout>
使用原生代码写flow流式布局是不是很简单呢。
具体Flow的一些具体属性可以看ConstraintLayout 2.0新特性解析(一)--Flow流式布局 - 简书
核心就是使用属性:app:constraint_referenced_ids
将7个ImageView约束起来。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<androidx.constraintlayout.helper.widget.Flow
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:flow_horizontalGap="10dp"
app:flow_verticalGap="10dp"
app:flow_wrapMode="none"
app:constraint_referenced_ids="image1,image2,image3,image4,image5,image6,image7" />
<ImageView
android:id="@+id/image1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/image2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/image3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/image4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/image5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/image6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/image7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
</androidx.constraintlayout.widget.ConstraintLayout>
边栏推荐
- Kotlin compose and native nesting
- How to correctly evaluate video image quality
- Uncover the practice of Baidu intelligent testing in the field of automatic test execution
- Baidu app's continuous integration practice based on pipeline as code
- A high density 256 channel electrode cap for dry EEG
- H. 265 introduction to coding principles
- Six simple cases of QT
- 单片机原理与接口技术(ESP8266/ESP32)机器人类草稿
- MySQL character type learning notes
- Comparison of batch merge between Oracle and MySQL
猜你喜欢
一个程序员的职业生涯到底该怎么规划?
Kotlin Compose 与原生 嵌套使用
Energy momentum: how to achieve carbon neutralization in the power industry?
单片机原理与接口技术(ESP8266/ESP32)机器人类草稿
Single chip microcomputer principle and Interface Technology (esp8266/esp32) machine human draft
Cerebral cortex: directed brain connection recognition widespread functional network abnormalities in Parkinson's disease
How to implement complex SQL such as distributed database sub query and join?
能源势动:电力行业的碳中和该如何实现?
Swift tableview style (I) system basic
Wechat applet - simple diet recommendation (3)
随机推荐
Cut off 20% of Imagenet data volume, and the performance of the model will not decline! Meta Stanford et al. Proposed a new method, using knowledge distillation to slim down the data set
[app packaging error] to proceed, either fix the issues identified by lint, or modify your build script as follow
Kotlin compose multiple item scrolling
程序员如何活成自己喜欢的模样?
Evolution of Baidu intelligent applet patrol scheduling scheme
Small program startup performance optimization practice
Zblogphp breadcrumb navigation code
把欧拉的创新带向世界 SUSE 要做那个引路人
【小技巧】获取matlab中cdfplot函数的x轴,y轴的数值
Fluent development: setting method of left and right alignment of child controls in row
Wechat applet - simple diet recommendation (4)
天龙八部TLBB系列 - 关于技能冷却和攻击范围数量的问题
卷起来,突破35岁焦虑,动画演示CPU记录函数调用过程
Windows uses commands to run kotlin
Cerebral cortex: directed brain connection recognition widespread functional network abnormalities in Parkinson's disease
天龙八部TLBB系列 - 单体技能群伤
Comment obtenir le temps STW du GC (collecteur d'ordures)?
历史上的今天:第一本电子书问世;磁条卡的发明者出生;掌上电脑先驱诞生...
Those who are good at using soldiers, hide in the invisible, and explain the best promotional value works in depth in 90 minutes
Oracle combines multiple rows of data into one row of data