在線上對於某些適用於要求強展現、輕交互、高可配場景,RN和WebView顯得不夠靈活,性能表現也不夠好,例如首頁feed流卡片,一級頁面的活動頁等,這些頁面的邏輯不強,也每每只是須要局部動態化。php
對於這些應用場景,美團APP團隊有本身的一套閉源的動態化容器MTFlexbox來應對,可讓佈局快速開發上線,而且不受發版限制。以前在美團實習期間有幸學習過MTFlexbox,這裏我要感謝一下美團APP終端業務研發組的同窗們,以及我本來的Leader。java
在實習結束返校以後,本身一直想作個實習總結,但又不知道以什麼爲主題比較合適。對於MTFlexbox理解得以及其適用的業務特色理解的還算深入,因此最終我選擇了嘗試本身去設計實現一個與MTFlexbox功能相似的開源框架Gbox。git
Gbox使用kotlin開發,在Apache開源協議下發布,不包含MTFlexbox的任何源代碼,也不是MTFlexbox的兼容版本,它是一個徹底基於開源軟件實現的全新開源軟件。github
Gbox從設計到技術選型再到編碼再到bug修復,足足花了我大半個月的時間,這期間本身踩了好多litho、Drawable和Canvas的坑,對於整個Android渲染架構的理解也更深入了。如今Gbox已經基本基本穩定,達到可用狀態,我將其開源在github上->Gbox(從版本號0.1.1開始,可以穩定使用)。apache
Gbox是對業務以及性能友好的:json
Gbox有豐富的樣式能力,可以實現圓角、高斯模糊、漸變色、文本、網絡圖片的繪製。得益於facebook開源的litho,佈局測量的工做能夠在異步線程進行,主線程只負責繪製,大大減輕了主線程的負擔,因此滑動幀數能夠達到媲美MTFlexbox的高度。後端
同時,得益於Apache開源的el表達式類庫(使用在嵌入式tomcat上的版本),使得Gbox樣式模板xml中的全部屬性均支持表達式解析,包括但不限於函數調用、算數運算、三元表達式、java bean訪問,同時Gbox還支持相似Jsp中的for語句。tomcat
對比美團首頁線上方案MTFlexbox,左爲MTFlexbox(美團APP),右爲Gbox(Gbox的實時預覽APP)。 bash
下面是上面右邊截圖渲染出來所須要的佈局樣式,以爲長的同窗能夠先跳過。網絡
<?xml version="1.0" encoding="utf-8"?>
<Flex background="WHITE" borderRadius="12" flexDirection="column" width="300">
<Flex alignItems="center" marginLeft="10" marginTop="12" flexDirection="row">
<Text textStyle="bold" textSize="16" text="碧藍航線電子科大店">
</Text>
<Text marginTop="2" paddingLeft="4" paddingRight="4" background="${draw:gradient(l2r,'#EE9611','#F7C709')}" borderRadius="3" marginLeft="12" text="外賣" textSize="10"/>
</Flex>
<Flex marginLeft="10" marginTop="5" flexDirection="row">
<Text textColor="#E6941A" textSize="11" text="4.1分">
</Text>
<Text textColor="#808080" textSize="11" text=" | 月售929">
</Text>
<Text textColor="#808080" textSize="11" text=" | 配送¥0">
</Text>
<Flex flexGrow="1">
</Flex>
<Text textColor="#808080" marginLeft="10" marginRight="10" textSize="11" text="31分鐘送達">
</Text>
</Flex>
<Flex alignItems="center" marginLeft="10" marginTop="5">
<Text borderRadius="3" paddingLeft="4" paddingRight="4" textSize="10" background="${draw:gradient(l2r,'#F70909','#FF6600')}" textColor="WHITE" text="優惠">
</Text>
<Text textColor="#808080" marginLeft="5" textSize="12" text="首單減12">
</Text>
</Flex>
<Flex height="100" flexGrow="1" marginBottom="10" marginLeft="7" marginRight="7" marginTop="8" flexDirection="row">
<Flex flexDirection="column" justifyContent="center" marginLeft="3" marginRight="3" flexGrow="1">
<Image borderRadius="4" scaleType="fitXY" flexGrow="1" url="${image2}">
</Image>
<Text marginTop="5" textAlign="center" textSize="11" text="拉菲">
</Text>
</Flex>
<Flex flexDirection="column" justifyContent="center" marginLeft="3" marginRight="3" flexGrow="1">
<Image borderRadius="4" scaleType="fitXY" flexGrow="1" url="${image1}">
</Image>
<Text marginTop="5" textAlign="center" textSize="11" text="初音將來">
</Text>
</Flex>
<Flex flexDirection="column" justifyContent="center" marginLeft="3" marginRight="3" flexGrow="1">
<Image blurSampling="3" blurRadius="25" borderRadius="4" scaleType="fitXY" flexGrow="1" url="${image2}">
</Image>
<Text marginTop="5" textAlign="center" textSize="11" text="高斯模糊">
</Text>
</Flex>
</Flex>
</Flex>
複製代碼
數據可由後端生成,正向綁定到模板中去。
{
"image1": "https://uploadfile.bizhizu.cn/2014/1127/20141127031018144.jpg",
"isEmpty": 1,
"name": "tttt",
"bofang": "100萬",
"bofangSize": 10,
"danmu": "10萬",
"gengduo": "https://s2.ax1x.com/2019/10/11/uqo5tJ.png",
"image2": "http://5b0988e595225.cdn.sohucs.com/images/20180606/0a49d21848324503a1e04c4b942a1631.png"
}
複製代碼
Gbox支持多種Widget,並有豐富的樣式支持,下面我將一一介紹它們
每種Widget都支持多種樣式,但有一些樣式是通用的
<?xml version="1.0" encoding="utf-8"?>
<Flex width="360" height="600" borderWidth="20" borderRadius="30" borderColor="red" background="${draw:gradient(t2b,red,blue)}">
</Flex>
複製代碼
使用Glide做爲圖片加載引擎,支持異步加載、高斯模糊(使用高效的renderscript實現)、圓角裁剪
用於顯示文本
flex風格的佈局容器
滑動列表實現,與ScrollView等價
與FrameLayout相似,可實現多層級疊加
可在佈局中嵌入傳統View
邏輯標籤,將內部的標籤展開成多組,三個字段都是必填的
<?xml version="1.0" encoding="utf-8"?>
<Flex height="${height}" >
<for name="index" from="1" to="3">
<Text text="${itemTexts[index]}" height="100">
</Text>
</for>
</Flex>
複製代碼
等價展開
<?xml version="1.0" encoding="utf-8"?>
<Flex height="${height}" >
<Text text="${itemTexts[1]}" height="100">
</Text>
<Text text="${itemTexts[2]}" height="100">
</Text>
<Text text="${itemTexts[3]}" height="100">
</Text>
</Flex>
複製代碼
Gbox還包含一些內置函數,能夠在表達式中調用
前往Gbox的github倉庫clone源代碼
//Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
//Add the dependency
dependencies {
implementation 'com.github.LukeXeon.flexbox:core:Tag'
}
複製代碼
iOS側和更多功能已經在開發計劃中,敬請關注,也歡迎你來貢獻,咱們將一塊兒開源共建,作出更好的Gbox。
最後的最後仍是慣例啦,若是喜歡個人文章別忘了給我點個贊,拜託了這對我來講真的很重要。若是你以爲東西對你有用的話,也拜託在GitHub上幫忙點個star吧。