原文連接html
在以前的文章《貓客 Tangram 頁面內組件的動態化方案》、VirtualView Android實現詳解(一)裏介紹了 VirtualView 方案,不過內容都側重與設計和實現原理,在進一步介紹其餘細節以前,仍是先來直觀感覺下它是什麼、它能實現的效果和它的使用方式吧。android
簡單講,就是咱們實現了一系列自定義控件,創建的經過自定義 XML 方式引用這些控件來搭建 UI 視圖,而後經過引擎解析 XML 數據並渲染出界面的方案。就比如在 Android 裏寫 XML 佈局文件而後渲染展現,或者寫 HTML 文件在瀏覽器裏渲染展現這兩種方式。git
在咱們實現的自定義控件裏,除了一部分基於系統控件封裝實現的控件,還有一類是基於 Canvas 繪製的方式實現的控件,它們依賴與一個實體的宿主控件存在,在最終渲染出來的時候不存在一一對應的實體 View,稱之爲虛擬化控件,VirtualView 由此得名。github
整套方案的設計必定程度上借鑑吸收了 Android 平臺上經過 XML 搭建界面的方式,其中最大的不一樣在與簡化了不少處理,脫離了平臺限制,在 iOS 上也實現了一套方案,能夠編寫一份模板在兩個平臺上運行。而且搭配上自定義 XML 數據的動態下發加載能力,能夠實現對端上界面視圖的動態調整。瀏覽器
已經開源此方案,能夠在 Github 上查看:bash
此方案能夠單獨使用,而也能夠配合 Tangram 使用,關於 Tangram,也能夠在 Github 上查看:app
大概須要這麼幾個過程:編寫模板 —— 編譯模板 —— 下發到客戶端 —— 渲染;工具
FrameLayout
、NImage
、NText
都是內置的控件,設置好各類屬性,能夠寫死也能夠經過表達式綁定一個數據字段引用。爲了方便上手體驗,作了一個 Playground ,能夠體驗內置基礎控件的能力,以及幾個業務場景下使用的真實組件,還將編譯模板的能力內置到 app 裏,能夠在 app 裏編譯 XML 模板並看效果。佈局
如下是幾個 Playground 裏經過 VirtualView 方案繪製的界面:
下載 Playground 並運行,以下操做:
第一次點擊若是 /sdcard/virtualview.xml 文件不存在,會從 Playground 的asset 裏拷貝一份文件過去,圖上展現的就是默認的效果; 用戶能夠本身傳一份 XML 文件到路徑 /sdcard/virtualview.xml,或者基於 Playground 裏的修改,而後編譯運行。
上圖中的模板文件和數據源碼分別以下:(一個橫向線性佈局加一個圖和一個文本,除了固定的寬高,動態數據經過表達式從 JSON 數據裏獲取)
<?xml version="1.0" encoding="utf-8"?>
<VHLayout
flag="flag_exposure|flag_clickable"
orientation="H"
layoutWidth="match_parent"
layoutHeight="wrap_content">
<NImage
id="1"
src="${logoUrl}"
layoutMarginLeft="8"
layoutMarginRight="8"
layoutMarginTop="8"
layoutMarginBottom="8"
layoutWidth="32"
layoutHeight="32"/>
<NText
id="2"
text="${title}"
layoutGravity="v_center"
gravity="${style.text-align}"
textSize="${style.font-size}"
textColor="${style.color}"
layoutWidth="match_parent"
layoutHeight="wrap_content"/>
</VHLayout>
複製代碼
{
"style": {
"text-align": "h_center",
"font-size": "20",
"color": "#FF5000"
},
"title": "超高性 99.9% 的用戶以爲很快",
"logoUrl": "https://gw.alicdn.com/tfs/TB1yGIdkb_I8KJjy1XaXXbsxpXa-72-72.png"
}
複製代碼
<?xml version="1.0" encoding="utf-8"?>
<VHLayout
flag="flag_exposure|flag_clickable"
orientation="V"
layoutWidth="match_parent"
layoutHeight="wrap_content">
<VHLayout
flag="flag_exposure|flag_clickable"
orientation="H"
layoutWidth="match_parent"
layoutHeight="wrap_content">
<NImage
id="1"
src="${logoUrl}"
layoutMarginLeft="8"
layoutMarginRight="8"
layoutMarginTop="8"
layoutMarginBottom="8"
layoutWidth="32"
layoutHeight="32"/>
<NText
id="2"
text="${title}"
layoutGravity="v_center"
gravity="${style.text-align}"
textSize="${style.font-size}"
textColor="${style.color}"
layoutWidth="match_parent"
layoutHeight="wrap_content"/>
</VHLayout>
<VHLayout
flag="flag_exposure|flag_clickable"
orientation="H"
layoutWidth="match_parent"
layoutHeight="wrap_content">
<VImage
id="1"
src="${logoUrl}"
layoutMarginLeft="8"
layoutMarginRight="8"
layoutMarginTop="8"
layoutMarginBottom="8"
layoutWidth="32"
layoutHeight="32"/>
<VText
id="2"
text="${title}"
layoutGravity="v_center"
gravity="${style.text-align}"
textSize="${style.font-size}"
textColor="${style.color}"
layoutWidth="match_parent"
layoutHeight="wrap_content"/>
</VHLayout>
</VHLayout>
複製代碼
如上圖及模板代碼所示,第一行內容圖片(NImage)和文本(NText)都是實體 View,而第二行內容圖片(VImage)和文本(VText)都是虛擬化的實現,經過在宿主容器的 Canvas 上繪製來展現。
講得再多,不如親自上手體驗一下,點擊下載源碼嘗試吧:)
補充了一篇獨立編譯工具的介紹:天貓客戶端組件動態化方案——VirtualView 工具大更新