当前位置:网站首页>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>边栏推荐
- A high density 256 channel electrode cap for dry EEG
- 【C语言】动态内存开辟的使用『malloc』
- Common fault analysis and Countermeasures of using MySQL in go language
- MySQL字符类型学习笔记
- How to get the STW (pause) time of GC (garbage collector)?
- Coordinate system of view
- Apache DolphinScheduler 系统架构设计
- [NTIRE 2022]Residual Local Feature Network for Efficient Super-Resolution
- The king of pirated Dall · e? 50000 images per day, crowded hugging face server, and openai ordered to change its name
- 如何獲取GC(垃圾回收器)的STW(暫停)時間?
猜你喜欢

On July 2, I invite you to TD Hero online press conference

oracle 多行数据合并成一行数据

Comment obtenir le temps STW du GC (collecteur d'ordures)?

Meitu lost 300 million yuan in currency speculation for half a year. Huawei was exposed to expand its enrollment in Russia. Alphago's peers have made another breakthrough in chess. Today, more big new
![[tips] get the x-axis and y-axis values of cdfplot function in MATLAB](/img/08/2d039df6ea3ace8685512b2af8281d.png)
[tips] get the x-axis and y-axis values of cdfplot function in MATLAB

ArcGIS Pro creating features
![[200 opencv routines] 219 Add digital watermark (blind watermark)](/img/ac/f6d16e74538bd589a1f6faee08d59a.png)
[200 opencv routines] 219 Add digital watermark (blind watermark)

Understand the window query function of tdengine in one article

单片机原理与接口技术(ESP8266/ESP32)机器人类草稿

Roll up, break 35 - year - old Anxiety, animation Demonstration CPU recording Function call Process
随机推荐
Unity粒子特效系列-毒液喷射预制体做好了,unitypackage包直接用 -下
Kotlin compose multiple item scrolling
Analysis on the wallet system architecture of Baidu trading platform
Flutter development: a way to solve the problem of blank space on the top of listview
Z-blog template installation and use tutorial
如何写出高质量的代码?
Roll up, break 35 - year - old Anxiety, animation Demonstration CPU recording Function call Process
Design and Simulation of fuzzy PID control system for liquid level of double tank (matlab/simulink)
Optimize database queries using the cursor object of SQLite
Dedecms website building tutorial
. Net delay queue
Generics, generic defects and application scenarios that 90% of people don't understand
Matrix processing practice
Windows uses commands to run kotlin
Mobile heterogeneous computing technology GPU OpenCL programming (Advanced)
Unity particle special effects series - the poison spray preform is ready, and the unitypackage package is directly used - on
La voie de l'évolution du système intelligent d'inspection et d'ordonnancement des petites procédures de Baidu
oracle 多行数据合并成一行数据
C#函数返回多个值方法
Tdengine already supports the industrial Intel edge insight package