自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android輕松搞定流動布局

企業(yè)動態(tài)
簡單來說 Flexbox 是屬于web前端領域CSS的一種布局方案,是2009年W3C提出了一種新的布局方案,可以響應式地實現(xiàn)各種頁面布局,并且React Native也是使用的Flex布局。

[[190928]]

以前我們要實現(xiàn)流動性布局,比較繁瑣,Google開源了一個項目叫FlexboxLayout,相信大家都不陌生。下面我們來學習一下FlexboxLayout基礎知識,并通過一個案例來加深理解。如果你對FlexboxLayout很熟悉,請忽略本文。

1. 什么是 Flexbox

簡單來說 Flexbox 是屬于web前端領域CSS的一種布局方案,是2009年W3C提出了一種新的布局方案,可以響應式地實現(xiàn)各種頁面布局,并且 React Native 也是使用的 Flex 布局。

我們可以簡單的理解為 Flexbox 是CSS領域類似 Linearlayout 的一種布局,但比 Linearlayout 要強大的多。

2. 什么是 FlexboxLayout?

我們在 Android 開發(fā)中使用 Linearlayout + RelativeLayout 基本可以實現(xiàn)大部分復雜的布局,但是Google就想了,有沒有類似 Flexbox 的一個布局呢?這使用起來一個布局就可以搞定各種復雜的情況了,于是 FlexboxLayout 就應運而生了。

所以 FlexboxLayout 是針對 Android 平臺的,實現(xiàn)類似 Flexbox 布局方案的一個開源項目,開源地址:https://github.com/google/flexbox-layout

3. 使用方式

使用方式很簡單,只需要添加以下依賴:

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

在xml布局中我們可以這樣使用

  1. <com.google.android.flexbox.FlexboxLayout 
  2.        android:id="@+id/flexbox_layout" 
  3.        android:layout_width="match_parent" 
  4.        android:layout_height="wrap_content" 
  5.        app:flexWrap="wrap"
  6.      <TextView 
  7.        android:id="@+id/tv1" 
  8.        android:layout_width="120dp" 
  9.        android:layout_height="80dp" 
  10.        app:layout_flexBasisPercent="50%" /> 
  11.       <TextView 
  12.        android:id="@+id/tv2" 
  13.        android:layout_width="80dp" 
  14.        android:layout_height="80dp" 
  15.        app:layout_alignSelf="center"/> 
  16.       <TextView 
  17.        android:id="@+id/tv3" 
  18.        android:layout_width="160dp" 
  19.        android:layout_height="80dp" 
  20.        app:layout_alignSelf="flex_end"/> 
  21.    </com.google.android.flexbox.FlexboxLayout> 

代碼中可以這樣使用

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

我們來看平臺熱門專題的布局:

下面我們來實現(xiàn)它,先來看最終實現(xiàn)的效果:

1. 新建activity_flow.xml布局

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     xmlns:app="http://schemas.android.com/apk/res-auto" 
  4.     android:layout_width="match_parent" 
  5.     android:layout_height="match_parent"
  6.     <com.google.android.flexbox.FlexboxLayout 
  7.         android:id="@+id/flexbox_layout" 
  8.         android:layout_width="match_parent" 
  9.         android:layout_height="wrap_content" 
  10.         app:flexWrap="wrap" /> 
  11. </RelativeLayout> 

布局很簡單,只有一個FlexboxLayout 因為我們需要動態(tài)創(chuàng)建它的item,所以就在這里固定寫TextView了。

2. 新建ActivityFlow Activity,填充數(shù)據(jù)源

  1. String[] tags = {"婚姻育兒""散文""設計""上班這點事兒""影視天堂""大學生活""美人說""運動和健身""工具癖""生活家""程序員""想法""短篇小說""美食""教育""心理""奇思妙想""美食""攝影"}; 
  2.         flexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout); 
  3.         for (int i = 0; i < tags.length; i++) { 
  4.             Book model = new Book(); 
  5.             model.setId(i); 
  6.             model.setName(tags[i]); 
  7.             flexboxLayout.addView(createNewFlexItemTextView(model)); 
  8.         } 

其中Book為一個實體,這個不是關鍵,關鍵的是createNewFlexItemTextView方法。

  1. /** 
  2.      * 動態(tài)創(chuàng)建TextView 
  3.      * @param book 
  4.      * @return 
  5.      */ 
  6.     private TextView createNewFlexItemTextView(final Book book) { 
  7.         TextView textView = new TextView(this); 
  8.         textView.setGravity(Gravity.CENTER); 
  9.         textView.setText(book.getName()); 
  10.         textView.setTextSize(12); 
  11.         textView.setTextColor(getResources().getColor(R.color.colorAccent)); 
  12.         textView.setBackgroundResource(R.drawable.tag_states); 
  13.         textView.setTag(book.getId()); 
  14.         textView.setOnClickListener(new View.OnClickListener() { 
  15.             @Override 
  16.             public void onClick(View view) { 
  17.                 Log.e(TAG, book.getName()); 
  18.             } 
  19.         }); 
  20.         int padding = Util.dpToPixel(this, 4); 
  21.         int paddingLeftAndRight = Util.dpToPixel(this, 8); 
  22.         ViewCompat.setPaddingRelative(textView, paddingLeftAndRight, padding, paddingLeftAndRight, padding); 
  23.         FlexboxLayout.LayoutParams layoutParams = new FlexboxLayout.LayoutParams( 
  24.                 ViewGroup.LayoutParams.WRAP_CONTENT, 
  25.                 ViewGroup.LayoutParams.WRAP_CONTENT); 
  26.         int margin = Util.dpToPixel(this, 6); 
  27.         int marginTop = Util.dpToPixel(this, 16); 
  28.         layoutParams.setMargins(margin, marginTop, margin, 0); 
  29.         textView.setLayoutParams(layoutParams); 
  30.         return textView; 
  31.     } 

其他有關Book實體和Util類,也貼出來一下

Book實體

  1. public class Book { 
  2.     private int id; 
  3.     private String name
  4.     public String getName() { 
  5.         return name
  6.     } 
  7.     public void setName(String name) { 
  8.         this.name = name
  9.     } 
  10.     public int getId() { 
  11.         return id; 
  12.     } 
  13.     public void setId(int id) { 
  14.         this.id = id; 
  15.     } 
  16.     public Book() { 
  17.     } 

Util工具類

  1. public class Util { 
  2.     public static int pixelToDp(Context context, int pixel) { 
  3.         DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 
  4.         return pixel < 0 ? pixel : Math.round(pixel / displayMetrics.density); 
  5.     } 
  6.     public static int dpToPixel(Context context, int dp) { 
  7.         DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 
  8.         return dp < 0 ? dp : Math.round(dp * displayMetrics.density); 
  9.     } 

這樣關于流動布局[FlexboxLayout],我們就實現(xiàn)完成了,是不是很簡單。

【本文為51CTO專欄作者“洪生鵬”的原創(chuàng)稿件,轉載請聯(lián)系原作者】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2009-12-11 15:37:58

Linux日志處理

2022-09-16 08:04:25

阿里云權限網(wǎng)絡

2009-10-23 17:51:51

Oracle用戶密碼

2025-02-07 08:39:32

Shell部署測試

2010-09-17 14:04:14

JVM內存設置

2010-06-04 09:08:56

2010-07-27 14:25:02

linux文件編碼

2009-11-12 10:53:57

ADO.NET連接My

2024-08-02 09:00:17

NettyWebSocketNIO

2009-09-13 20:28:38

Linq插入數(shù)據(jù)

2020-05-11 10:59:02

PythonWord工具

2024-08-09 08:52:26

2016-03-17 17:35:15

云容器虛擬化管理Docker

2009-11-24 15:34:41

DNS服務器組建

2011-05-23 14:15:31

2025-02-26 07:58:41

2024-06-06 08:40:07

2011-03-25 09:01:42

Web亂碼

2009-08-17 08:45:34

Windows 7文件刪除

2022-09-29 10:51:18

ShellLinux命令審計
點贊
收藏

51CTO技術棧公眾號