【轉】 ConstraintLayout 完全解析 快來優化你的布局吧

轉自:?
http://blog.csdn.net/lmj623565791/article/details/78011599?
本文出自張鴻洋的博客

一、概述

ConstraintLayout出現有一段時間了,不過一直沒有特別去關注,也多多少少看了一些文字介紹,多數都是對使用可視化布局拖拽,個人對拖拽一直不看好,直到前段時間看到該文:

  • 解析ConstraintLayout的性能優勢

非常詳盡的介紹了ConstraintLayout的性能優勢,于是乎開始學習了一下ConstraintLayout。

本文的重點不在與可視化界面的學習,而在于如何手寫各類約束布局屬性。對于可視化界面學習推薦:

  • Android新特性介紹,ConstraintLayout完全解析

下面開始進入正題,大家都知道,當布局嵌套深入比較深的時候,往往會伴隨著一些性能問題。所以很多時候我們建議使用RelativeLayout或者GridLayout來簡化掉布局的深度。

而對于簡化布局深度,ConstraintLayout幾乎可以做到極致,接下來我們通過實例來盡可能將所有常見的屬性一步步的介紹清楚。

首先需要引入我們的ConstraintLayout,在build.gradle中加入:

compile 'com.android.support.constraint:constraint-layout:1.0.2'

二、來編寫一個Feed Item

我們先看一個簡單的新聞列表中常見的feed item。

看到這樣的布局,大家條件反射應該就是使用RelativeLayout來做,當然了,本案例我們使用ConstraintLayout來寫:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#11ff0000" tools:context="com.zhy.constrantlayout_learn.MainActivity"> <TextView android:id="@+id/tv1" android:layout_width="140dp" android:layout_height="86dp" android:layout_marginLeft="12dp" android:layout_marginTop="12dp" android:background="#fd3" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tv2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginRight="12dp" android:text="馬云:一年交稅170多億馬云:一年交稅170多億馬云:一年交稅170多億" android:textColor="#000000" android:textSize="16dp" app:layout_constraintLeft_toRightOf="@id/tv1" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="@id/tv1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginTop="12dp" android:text="8分鐘前" android:textColor="#333" android:textSize="12dp" app:layout_constraintLeft_toRightOf="@id/tv1" app:layout_constraintBottom_toBottomOf="@id/tv1" /> </android.support.constraint.ConstraintLayout>

看上面的布局,我們好像看到了幾個模式的屬性:

首先是tv1,有兩個沒見過的屬性:

  • app:layout_constraintLeft_toLeftOf="parent"

從字面上看,指的是讓該控件的左側與父布局對齊,當我們希望控件A與控件B左側對齊時,就可以使用該屬性。

app:layout_constraintLeft_toLeftOf="@id/viewB"

類似的還有個相似的屬性為:

  • app:layout_constraintLeft_toRightOf

很好理解,即當前屬性的左側在誰的右側,當我們希望控件A在控件B的右側時,可以設置:

app:layout_constraintLeft_toRightOf="@id/viewB"

與之類似的還有幾個屬性:

  • layout_constraintRight_toLeftOf
  • layout_constraintRight_toRightOf
  • layout_constraintTop_toTopOf
  • layout_constraintTop_toBottomOf
  • layout_constraintBottom_toTopOf
  • layout_constraintBottom_toBottomOf
  • layout_constraintBaseline_toBaselineOf

類推就可以了。

現在在頭看剛才的布局:

tv1設置了:app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"tv2設置了:app:layout_constraintLeft_toRightOf="@id/tv1"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv1" tv3設置了: app:layout_constraintLeft_toRightOf="@id/tv1" app:layout_constraintBottom_toBottomOf="@id/tv1"

按照我們剛才的理解,再次的解讀下:

tv1應該是在父布局的左上角;

tv2在tv1的右側,tv2的右側和父布局對其,tv2和tv1頂部對齊;

tv3在tv1的右側,tv3和tv1底部對其。

到這里,大家可以看到,目前我們已經可以控制任何一個控件與其他控件間的相對位置了,以及與parent間的相對位置。

和RL的差異

大家是不是覺得目前來看和RelativeLayout特別像?

其實還是有很明顯的區別的,我們通過一個例子來看一下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/id_btn01" android:layout_width="100dp" android:text="Btn01" android:layout_height="wrap_content" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/id_btn01" android:text="Btn02" android:layout_alignParentRight="true" /> </RelativeLayout>

那么經過我們剛才的學習,把:

layout_toRightOf="@id/id_btn01"layout_alignParentRight="true"

分別替換為:

app:layout_constraintLeft_toRightOf="@id/id_btn01"app:layout_constraintRight_toRightOf="parent"

是不是覺得so easy ,但是我們看一下效果圖:

是不是和預期有一定的區別,假設你將Btn02的寬度設置的非常大,你會發現更加詭異的事情:

你會發現Btn02,好像瘋了一樣,我們設置的在btn01右側,和與parent右側對齊完全失效了!!!

別怕,接下來就讓你認識到為什么這個控件叫做“Constraint”Layout。

在當控件有自己設置的寬度,例如warp_content、固定值時,我們為控件添加的都是約束“Constraint”,這個約束有點像橡皮筋一樣會拉這個控件,但是并不會改變控件的尺寸(RL很明顯不是這樣的)。

例如上例,當btn02的寬度較小時,我們為其左側設置了一個約束(btn01右側),右側設置了一個約束(parent右側對其),當兩個約束同時生效的時候(你可以認為兩邊都是相同的一個拉力),btn02會居中。

當btn02特別大的時候,依然是這兩個力,那么會發生什么?會造成左側和右側超出的距離一樣大。

那么現在大家肯定有些疑問:

  • 怎么樣才能和上面的RL一樣,寬度剛好占據剩下的距離呢(btn01右側到屏幕右側的距離)?

這個問題,問得很好,我們剛才所有的嘗試都是在控件自身擁有特定的寬度情況下執行的;那么如果希望控件的寬度根據由約束來控件,不妨去掉這個特定的寬度,即設置為0試試?

對!當我們將btn02的寬度設置為0時,一切又變得很完美。

那么這里,你可能會問0值是什么含義,其實在ConstraintLayout中0代表:MATCH_CONSTRAINT,看到這個常量,是不是瞬間覺得好理解了一點。

  • 最后一個問題,MATCH_PARENT哪去了?

看官網的解釋:

Important:?MATCH_PARENT?is not supported for widgets contained in a ConstraintLayout, though similar behavior can be defined by using?MATCH_CONSTRAINT?with the corresponding left/right or top/bottom constraints being set to “parent”.`

所以你可以認為:在ConstraintLayout中已經不支持MATCH_PARENT這個值了,你可以通過MATCH_CONSTRAINT配合約束實現類似的效果。

好了,到這里,目前我們已經看到其已經和RelativeLayout勢均力敵了,接下來我們看一下RL做不到的特性。

三、增加一個banner

我們現在以往在這個feed item頂部添加一個banner,寬度為占據整個屏幕,寬高比為16:6。

這里尷尬了,在之前的做法,很難在布局中設置寬高比,一般我們都需要在代碼中顯示的去操作,那么如果你用了ConstraintLayout,它就支持。

看一眼如何支持:

<android.support.constraint.ConstraintLayout ...tools:context="com.zhy.constrantlayout_learn.MainActivity"> <TextView android:id="@+id/banner" android:layout_width="0dp" android:layout_height="0dp" android:background="#765" android:gravity="center" android:text="Banner" app:layout_constraintDimensionRatio="H,16:6" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> <TextView android:id="@+id/tv1" app:layout_constraintTop_toBottomOf="@id/banner" ></TextView> ... </...>

我們添加了一個banner,還記得我們剛才所說的么,不要使用match_parent了,而是設置match_contraint,即0,讓約束來控制布局寬高。

所以我們設置了寬、高都是match_contraint,然后這兩個屬性:

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"

讓我們的寬度充滿整個父布局,在添加一個:

app:layout_constraintDimensionRatio="16:6"

該屬性指的是寬高比,所以16:6就可以完成我們的需求。

好了看下效果圖:

這個寬高比屬性,還支持這樣的寫法:

app:layout_constraintDimensionRatio="W,16:6"
app:layout_constraintDimensionRatio="H,16:6"

可以自己試驗下。

好了,到這里,我們又新增了一個屬性,還是個非常實用的屬性。

那么,我們繼續,再看一個似曾相識的功能。

四、增加幾個Tab

現在我們希望在底部增加3個tab,均分。是不是想到了LinearLayout和weight。

沒錯!ConstraintLayout也支持類似的屬性。

雖然我知道,但是寫到這我還是有點小驚喜~~

看下如何實現:

<TextViewandroid:id="@+id/tab1"android:layout_width="0dp" android:layout_height="30dp" android:background="#f67" android:gravity="center" android:text="Tab1" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@+id/tab2" /> <TextView android:id="@+id/tab2" android:layout_width="0dp" android:layout_height="30dp" android:background="#A67" android:gravity="center" android:text="Tab2" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toRightOf="@id/tab1" app:layout_constraintRight_toLeftOf="@+id/tab3" /> <TextView android:id="@+id/tab3" android:layout_width="0dp" android:layout_height="30dp" android:background="#767" android:gravity="center" android:text="Tab3" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toRightOf="@id/tab2" app:layout_constraintRight_toRightOf="parent" />

?

我們增加3個textview來冒充tab。我們看橫向的依賴,3個tab兩兩設置了約束(即你在我們的左邊,我在你的右邊),最外層的設置了parent約束;再加上我們把寬度都設置為了match_constraint,so,這樣我們就完成了3個tab等分。

看一眼效果圖:

你可能會說,LL配合weight更加靈活,可以單個設置占據的比例。

對,沒錯,我們也支持,我不是還沒說完么。

現在我們可以給每個tab設置一個屬性:

app:layout_constraintHorizontal_weight
  • 1

看到這個名字,應該就明白了吧,假設我們分別設置值為2,1,1。

效果圖為:

是不是很驚喜,別急,剛才你說我不如LL,現在我要讓你再看一些LL配合weight做不到的。

這里需要借助幾張官網上的圖了:

剛才我們說了,3個tab兩兩設置了依賴,即類似下圖:

橫向的相當于組成了一個鏈(Chains)。在這個鏈的最左側的元素成為鏈頭,我們可以在其身上設置一些屬性,來決定這個鏈的展示效果:

該屬性為:

layout_constraintHorizontal_chainStyle

我們已經見過一種效果了,即按照weight等分,可以成為weighted chain。設置條件為:

chainStyle=”spread”,所有控件寬度設置為match_constraint,因為默認就是spread,所以我們沒有顯示設置。

其取值還可以為:

  • packed
  • spread_inside

我還是分別顯示一下吧:

  1. spread + 寬度非0

  1. spread + 寬度為0,且可以通過weight控制分配比例(上例)

  2. spread_inside + 寬度非0

  1. packed + 寬度非0

好了,差不多了,我們可以在橫向或者縱向組成一個Chain,然后在Chain head設置chainStyle來搞一些事情。

官網有個圖:

前四個我們都演示了,最后一個設計到一個新的bias屬性,別急,咱們慢慢說~~

好了,到這里,我們再次見證了ConstraintLayout的強大。

我們最后再看一個例子。

五、增加浮動按鈕

一個很常見的功能,我們現在希望在右下角增加一個浮動按鈕。

看下如何實現:

<android.support.constraint.ConstraintLayout ...tools:context="com.zhy.constrantlayout_learn.MainActivity"> <TextView android:layout_width="60dp" android:layout_height="60dp" android:background="#612" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.9" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.9" /> </....>

我們在最后追加一個TextView冒充我們的浮動按鈕。可以看到我們設置了固定值,被設置約束為右下角。

正常情況我們可以通過margin來設置與右側與底部的距離。

但是這里我們嘗試使用量個新的屬性:

layout_constraintHorizontal_bias
layout_constraintVertical_bias

即設置上下兩側間隙比例分別為90%與10%。這個很好理解,我們之前說了,再沒有bias這個屬性的時候,這兩側的拉力大小是一樣的,但是你可以通過bias來控制哪一側的力要大一些~~明白了么~

所以,該屬性可以用于約束之前,控制兩側的“拉力”。

我們看一下效果圖:

那么到這里,ConstraintLayout的屬性我們基本上介紹完了:

我們看一下:

layout_constraintLeft_toLeftOf 
layout_constraintLeft_toRightOf
layout_constraintRight_toLeftOf
layout_constraintRight_toRightOf
layout_constraintTop_toTopOf
layout_constraintTop_toBottomOf
layout_constraintBottom_toTopOf
layout_constraintBottom_toBottomOf# 即文章的baseline對齊
layout_constraintBaseline_toBaselineOf# 與left,right類似
layout_constraintStart_toEndOf 
layout_constraintStart_toStartOf
layout_constraintEnd_toStartOf
layout_constraintEnd_toEndOf# margin不需要解釋
android:layout_marginStart
android:layout_marginEnd
android:layout_marginLeft
android:layout_marginTop
android:layout_marginRight
android:layout_marginBottomlayout_constraintHorizontal_bias  
layout_constraintVertical_bias  layout_constraintHorizontal_chainStyle
layout_constraintVertical_chainStylelayout_constraintVertical_weightGuideline 

好像,還有個比較特殊的,叫Guideline。

好吧,繼續~

六、嘗試使用Guideline

android.support.constraint.Guideline該類比較簡單,主要用于輔助布局,即類似為輔助線,橫向的、縱向的。該布局是不會顯示到界面上的。

所以其有個屬性為:

android:orientation取值為”vertical”和”horizontal”.

除此以外,還差個屬性,決定該輔助線的位置:

  • layout_constraintGuide_begin
  • layout_constraintGuide_end
  • layout_constraintGuide_percent

可以通過上面3個屬性其中之一來確定屬性值位置。

begin=30dp,即可認為距離頂部30dp的地方有個輔助線,根據orientation來決定是橫向還是縱向。

end=30dp,即為距離底部。?
percent=0.8即為距離頂部80%。

好了,下面看一個例子,剛才我們的浮點按鈕,我決定通過兩根輔助線來定位,一根橫向距離底部80%,一個縱向距離頂部80%,浮點按鈕就定位在他們交叉的地方。

<android.support.constraint.ConstraintLayout ...tools:context="com.zhy.constrantlayout_learn.MainActivity"> <android.support.constraint.Guideline android:id="@+id/guideline_h" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.8" /> <android.support.constraint.Guideline android:id="@+id/guideline_w" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.8" /> <TextView android:layout_width="60dp" android:layout_height="60dp" android:background="#612" app:layout_constraintLeft_toRightOf="@id/guideline_w" app:layout_constraintTop_toBottomOf="@id/guideline_h" /> </....>

我感覺都不用解釋了~~看眼效果圖吧:

到此,屬性基本上講完啦~

可以看到,上述相當復雜的一個布局,在ConstraintLayout中完全沒有嵌套!

六、總結

本文通過實際的按鈕,基本上介紹了ConstraintLayout所支持的所有的屬性,全文沒有提及拖拽,因為當界面復雜之后,想要完美的拖拽實在是太難了,而且誰也不期望,看不懂拖拽完成后的布局屬性吧~

所以,我建議還是盡可能手寫,通過本文這樣一個流程,雖然支持的屬性有20多個,但是分類后并不難記,難記也可以拿出本文翻一翻~

好了,思考了半天,如何通過一個案例介紹完所有的屬性,總體來說還是完成了,給自己點個贊。

轉載于:https://www.cnblogs.com/ryq2014/p/8328833.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284386.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IoTDB 的C# 客戶端發布 0.13.0.7

IoTDB C# Client 0.13.0.7 已經發布&#xff0c; 此版本更新的內容為筆者為Apache-IoTDB-Client-CSharp實現了Ado.Net的兼容層&#xff0c;降低了對IoTDB的使用門檻。于此同時&#xff0c; IoTSharp也開始支持了IoTDB的數據入庫&#xff0c;隨著晚些時候IoTSharp 2.7 版本的發布…

[轉]Docker超詳細基礎教程,快速入門docker

一、docker概述 1.什么是docker Docker 是一個開源的應用容器引擎&#xff0c;基于 Go 語言 并遵從 Apache2.0 協議開源。 Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中&#xff0c;然后發布到任何流行的 Linux 機器上&#xff0c;也可以實現虛擬…

【Zookeeper】源碼分析之服務器(一)

一、前言 前面已經介紹了Zookeeper中Leader選舉的具體流程&#xff0c;接著來學習Zookeeper中的各種服務器。 二、總體框架圖 對于服務器&#xff0c;其框架圖如下圖所示 說明&#xff1a; ZooKeeperServer&#xff0c;為所有服務器的父類&#xff0c;其請求處理鏈為PrepReques…

linux下配置samba服務器(以CentOS6.7為例)

一、簡介&#xff08;百度百科&#xff09;Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件&#xff0c;由服務器及客戶端程序構成。SMB&#xff08;Server Messages Block&#xff0c;信息服務塊&#xff09;是一種在局域網上共享文件和打印機的一種通信協議&#xff0c…

【ArcGIS微課1000例】0037:上下標標注記案例教程

在利用ArcGIS進行制圖時&#xff0c;進行標注(Label) 或注記(Annolation) 是必不可少的。但是除了常規的標注和注記以外&#xff0c;還時常需要一些特殊的標注或注記&#xff0c;比如上標、下標等。 文章目錄一、上標標注方法二、下標標注方法一、上標標注方法 上下標代碼模板…

Redis——緩存擊穿、穿透、雪崩

1、緩存穿透&#xff1a; &#xff08;1&#xff09;問題描述&#xff1a;key對應的數據并不存在&#xff0c;每次請求訪問key時&#xff0c;緩存中查找不到&#xff0c;請求都會直接訪問到數據庫中去&#xff0c;請求量超出數據庫時&#xff0c;便會導致數據庫崩潰。如一個用…

數據庫性能系列之子查詢

前言說起數據庫&#xff0c;想必一些朋友會認為&#xff0c;數據庫不就是天天CRUD嗎&#xff1f;只要我掌握了這幾招&#xff0c;根本不在話下。是的&#xff0c;其實我也很贊同這個觀點&#xff0c;對于大多數應用程序來說&#xff0c;只掌握這些內容&#xff0c;是可以勝任日…

shell printf命令:格式化輸出語句

shell printf命令&#xff1a;格式化輸出語句注意&#xff1a;使用printf的腳本比使用echo移植性好。如同echo命令&#xff0c;printf命令可以輸出簡單的字符串&#xff1a;[rootmaster ~]#printf "Hello, Shell\n"Hello, Shellprintf不像echo那樣會自動提供一個換行…

UVa 10905 孩子們的游戲

https://vjudge.net/problem/UVA-10905 題意&#xff1a; 給定n個正整數&#xff0c;把它們連接成一個最大的整數。 思路&#xff1a; 實在是沒想到直接用string來排序了。 1 #include<iostream> 2 #include<algorithm>3 #include<string>4 using namespace …

laravel 內部驗證碼

為什么80%的碼農都做不了架構師&#xff1f;>>> 1.找到此文件composer.json 如下圖添加 "gregwar/captcha": "1.*" 行代碼 2.在命令行中執行 composer update 安裝完成后 3.找到控制器添加如下代碼 public function captcha($tmp) {//生成驗證…

k8s docker集群搭建

一、Kubernetes系列之介紹篇 1.背景介紹 云計算飛速發展 - IaaS - PaaS - SaaS Docker技術突飛猛進 - 一次構建&#xff0c;到處運行 - 容器的快速輕量 - 完整的生態環境 2.什么是kubernetes 首先&#xff0c;他是一個全新的基于容器技術的分布式架構領先方案。Kubernetes(k8…

leetcode 66 Plus One

給定一個數組&#xff0c;表示整數的各個位數&#xff0c;現要將其加上1&#xff0c;考慮進位。 vector<int> plusOne(vector<int>& digits) {int size digits.size();bool carry true;for (int i size - 1; i > 0; --i) {if (digits[i] 9 && c…

如何讓最小 API 綁定查詢字符串中的數組

前言在上次的文章中&#xff0c;我們實現了《讓 ASP.NET Core 支持綁定查詢字符串中的數組》&#xff1a;[HttpGet] public string Get([FromQuery][ModelBinder(BinderType typeof(IntArrayModelBinder))] int[] values) {return string.Join(" ", values.Select(p…

Kubernetes api-server源碼閱讀2(Debug Kubernetes篇)

云原生學習路線導航頁&#xff08;持續更新中&#xff09; 本文是 Kubernetes api-server源碼閱讀 系列第二篇&#xff0c;主要講述如何實現 kubernetes api-server 的 debug 參考b站視頻地址&#xff1a;Kubernetes源碼開發之旅二 1.本篇章任務 Go-Delve&#xff1a;go語言的…

webrtc 視頻 demo

webrtc 視頻 demo webrtc網上封裝的很多&#xff0c;demo很多都是一個頁面里實現的&#xff0c;今天實現了個完整的 &#xff0c; A 發視頻給 BA webrtc.html作為offer <!DOCTYPE html> <html id"home" lang"en"><head><meta http-e…

條件注釋判斷瀏覽器版本!--[if lt IE 9](轉載)

<!--[if !IE]><!--> 除IE外都可識別 <!--<![endif]--> <!--[if IE]> 所有的IE可識別 <![endif]--> <!--[if IE 6]> 僅IE6可識別 <![endif]--> <!--[if lt IE 6]> IE6以及IE6以下版本可識別 <![endif]--> <!--[if …

[轉]阿里開源低代碼引擎LowCodeEngine

一、什么是低代碼引擎 低代碼引擎是具備強大擴展能力的低代碼研發框架&#xff0c;使用者只需要基于低代碼引擎便可以快速定制符合自己業務需求的低代碼平臺。同時&#xff0c;低代碼引擎還在標準低代碼設計器的基礎上提供了簡單易用的定制擴展能力&#xff0c;能夠滿足業務獨特…

Beyond Istio OSS——Istio服務網格的現狀與未來

作者&#xff1a;宋凈超&#xff08;Jimmy Song&#xff09;&#xff0c;原文地址&#xff1a;https://jimmysong.io/blog/beyond-istio-oss/本文根據筆者在 GIAC 深圳 2022 年大會上的的演講《Beyond Istio OSS —— Istio 的現狀及未來》[1] 整理而成&#xff0c;演講幻燈片見…

js多維數組扁平化

數組扁平化&#xff0c;就是將多維數組碾平為一維數組&#xff0c;方便使用。 一&#xff1a;例如&#xff0c;一個二維數組 var arr [a, [b, 2], [c, 3, x]]&#xff0c;將其扁平化&#xff1a; 1. 通過 apply 借用數組的 concat 方法&#xff1a; [].concat.apply([], arr)…

第16講 用戶程序的結構與執行

轉載于:https://www.cnblogs.com/atuo/p/5609843.html