Tangram與VirtualView初探

標(biāo)簽(空格分隔): 阿里 virtualview tangram


前言

在進(jìn)入VirtualView之前茂卦,我們首先來了解下Tangram這個(gè)同樣是阿里出品男杈、用于快速實(shí)現(xiàn)組合布局的框架模型悯蝉。

Tangram

移動(dòng)端原生App最大的弱點(diǎn)就是不能像Web端那樣即改即用寒亥,需要等下一個(gè)版本發(fā)布之后才能看到效果仅颇。所以衍生出來許許多多的動(dòng)態(tài)化方案受神,如RN等剖膳;但在動(dòng)態(tài)化與性能方面又不是那么完美魏颓。所以Tangram方案由此誕生。

背景:技術(shù)是用于滿足需求業(yè)務(wù)的解決方案吱晒,現(xiàn)有的需求業(yè)務(wù)被其分為了三類:基礎(chǔ)業(yè)務(wù)甸饱、常規(guī)業(yè)務(wù)臨時(shí)性業(yè)務(wù)

業(yè)務(wù)類型 定義 功能例子 性能要求 現(xiàn)有解決方案
基礎(chǔ)業(yè)務(wù) 產(chǎn)品最基礎(chǔ)的功能需求 注冊(cè)、登陸 需求穩(wěn)定,對(duì)穩(wěn)定性及性能要求最高 原生Native
常規(guī)業(yè)務(wù) 產(chǎn)品較為常規(guī)的功能需求 首頁 需求變化少叹话,對(duì)穩(wěn)定性及性能要求較高 RN
臨時(shí)性業(yè)務(wù) 產(chǎn)品臨時(shí)性的功能需求 活動(dòng)頁 需求變化大偷遗,對(duì)穩(wěn)定性及性能要求低 WebView+HTML

對(duì)于臨時(shí)性業(yè)務(wù),使用WebView+HTML開發(fā)已然足夠驼壶,隨著WebView性能的提升和Mobile開發(fā)框架與開發(fā)技能日趨成熟氏豌,現(xiàn)階段HTML體現(xiàn)出的劣勢(shì)終將蕩然無存。
對(duì)于基礎(chǔ)業(yè)務(wù)热凹,其穩(wěn)定性及性能要求非常高泵喘,而需求變化少,所以采用原生開發(fā)是最好的選擇般妙。

Tangram是主要針對(duì)的是常規(guī)業(yè)務(wù)(對(duì)動(dòng)態(tài)化有著要求纪铺,也對(duì)性能有要求)的解決方案。其基本理念是粗粒度組件化+靈活布局容器碟渺,關(guān)注的重點(diǎn)是面向業(yè)務(wù)霹陡,多終端一致性和高性能

Tangram優(yōu)點(diǎn):高性能(頁面渲染效率&組件回收復(fù)用止状,跨父節(jié)點(diǎn)組件的高效回收與復(fù)用);面向業(yè)務(wù)(組件業(yè)務(wù)化攒霹,動(dòng)態(tài)化怯疤,通過布局+組件的形式搭建整個(gè)頁面,而不是從基本的UI元素搭建頁面)催束;擴(kuò)展性好(自定義組件可以注入)集峦;多終端一致性(一個(gè)json描述的布局可以同時(shí)在iOS端與Android端使用,且表現(xiàn)一致)抠刺。

組件->卡片->頁面

集成過程:

  • 初始化Tangram
//全局只需要初始化一次塔淤,提供一個(gè)通用的圖片加載器(如Picasso)以及一個(gè)應(yīng)用內(nèi)通用的ImageView類型
TangramBuilder.init(context, new IInnerImageSetter() {
    @Override
    public <IMAGE extends ImageView> void doLoadImageUrl(IMAGE view, String url) {
        //假設(shè)你使用 Picasso 加載圖片
        Picasso.with(context).load(url).into(view);
    }
}, ImageView.class);
  • 注冊(cè)自定義卡片與組件
//TangramBuilder中已經(jīng)預(yù)先注冊(cè)了許多組件及卡片,可直接使用速妖;此處只需要注冊(cè)自定義的組件及卡片即可
builder = TangramBuilder.newInnerBuilder(this);
builder.registerCell("自定義名字1", 自定義組件1.class);
builder.registerCell("自定義名字2", 自定義組件2.class);
builder.registerCard("自定義名字3", 自定義卡片3.class);
builder.registerCell(數(shù)字, 自定義組件4.class);
builder.registerVirtualView("VirtualView名字");//Tangram對(duì)VirtualView的支持
  • 生成TangramEngine實(shí)例
engine = builder.build();
engine.setVirtualViewTemplate(VirtualView模版編繹后的字節(jié)碼);
  • 綁定業(yè)務(wù)support類到engine
engine.addSimpleClickSupport(new XXClickSupport()); //添加點(diǎn)擊事件支持
engine.addCardLoadSupport(new XXCardLoadSupport()); //添加加載更多支持
engine.addExposureSupport(new XXExposureSuport());  //添加曝光事件支持
  • 綁定recyclerView高蜂,監(jiān)聽Scroll事件
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        engine.onScrolled();
    }
});
  • 加載數(shù)據(jù)并傳遞給engine
String jsonString = getJsonStringFromFile(jsonFilePath);
JSONArray data = null;
try {
    data = new JSONArray(jsonString);
    engine.setData(data);
} catch (JSONException e) {
    e.printStackTrace();
}

一個(gè)Json數(shù)據(jù)示例:

[
  {
    "type": "container-scroll",  //預(yù)定義卡片類型-類似ScrollView
    "style": {  //該卡片的一些樣式及屬性
      "pageWidth": 200,
      "pageHeight": 100,
      "indicatorMargin": "5",
      "infinite": "true"
    },
    "items": [  //該卡片內(nèi)的一些組件
      {
        "type": 1, // 第一個(gè)組件的類型,必須是已經(jīng)注冊(cè)過的罕容;未被注冊(cè)過的將會(huì)被忽略
        "msg": "info1", // 該對(duì)應(yīng)組件的相關(guān)數(shù)據(jù)等
        "style": {}
      },
      {
        "type": 1,
        "msg": "info2",
        "style": {}
      }
    ]
  },
  {
    "type": "10",  // 第二個(gè)卡片的類型
    "style": {
      "indicatorMargin": "5",
      "infinite": "true"
    },
    "items": [
      {
        "type": 1,
        "msg": "info1",
        "style": {}
      },
      {
        "type": 1,
        "msg": "info2",
        "style": {}
      }
    ]
  }
]

VirtualView

Tangram中已經(jīng)實(shí)現(xiàn)了頁面布局的動(dòng)態(tài)化备恤,我們可以通過配置json文件自由的布局;但還有一個(gè)局限性锦秒,json中使用的卡片或者組件的type露泊,必須是注冊(cè)O(shè)K的(也就是在客戶端已經(jīng)實(shí)現(xiàn)好的)才能使用;如果想要在原來的版本中新增一個(gè)type類型的組件旅择,這是沒有辦法做到的惭笑,還是只能通過升級(jí)客戶端來實(shí)現(xiàn)。
于是,VirtualView出現(xiàn)了沉噩。

VirtualView簡(jiǎn)介
VirtualView簡(jiǎn)介

VirtualView的特點(diǎn):


VirtualView特點(diǎn)
VirtualView特點(diǎn)

基布局描術(shù)文件是一個(gè)xml文件捺宗,并附帶一個(gè)json數(shù)據(jù)文件:
描述布局文件示例:(其中的相關(guān)數(shù)據(jù)來源都可以從數(shù)據(jù)json文件中使用表達(dá)式獲取)

 <RatioLayout
    orientation="H"
    layoutWidth="match_parent"
    layoutHeight="wrap_content"
    background="#f8f8f8">
    <VHLayout
        layoutRatio="1"
        orientation="V"
        layoutWidth="0"
        layoutHeight="match_parent"
        background="#f8f8f8">
        <VImage
            layoutWidth="match_parent"
            layoutHeight="120.5"
            scaleType="fit_xy"
            src="${picture_2}"/>
        <VLine
            layoutWidth="match_parent"
            layoutHeight="0.5"
            paintWidth="0.5"
            orientation="H"
            color="#e8ecef" />
        <VImage
            layoutWidth="match_parent"
            layoutHeight="60"
            scaleType="fit_xy"
            src="${picture_5}"/>
    </VHLayout>
    <VLine
        layoutWidth="0.5"
        layoutHeight="match_parent"
        paintWidth="0.5"
        orientation="V"
        color="#e8ecef" />
    <VHLayout
        layoutRatio="1"
        orientation="V"
        layoutWidth="0"
        layoutHeight="match_parent"
        background="#f8f8f8">
        <VImage
            layoutWidth="match_parent"
            layoutHeight="60"
            scaleType="fit_xy"
            src="${picture_3}"/>
        <VLine
            layoutWidth="match_parent"
            layoutHeight="0.5"
            paintWidth="0.5"
            orientation="H"
            color="#e8ecef" />
        <VImage
            layoutWidth="match_parent"
            layoutHeight="60"
            scaleType="fit_xy"
            src="${picture_4}"/>
        <VLine
            layoutWidth="match_parent"
            layoutHeight="0.5"
            paintWidth="0.5"
            orientation="H"
            color="#e8ecef" />
        <VImage
            layoutWidth="match_parent"
            layoutHeight="60"
            scaleType="fit_xy"
            src="${picture_6}"/>
    </VHLayout>
</RatioLayout>

數(shù)據(jù)json文件示例:

{
  "picture_2": "http://xxxx/images/59afb155c769f.png",
  "picture_3": "http://xxxx/images/59afb303042ca.png",
  "picture_4": "http://xxxx/images/59afb303042cb.png",
  "picture_5": "http://xxxx/images/59afb36cf1eb8.png",
  "picture_6": "http://xxxx/images/59afb303042cd.png"
}

xml文件需要經(jīng)過編繹生成目標(biāo)文件才可加載使用屁擅,如果用于項(xiàng)目中一般下發(fā)的都是經(jīng)過編繹后的文件偿凭,也可以在客戶端實(shí)時(shí)編繹。

一個(gè)xml就是一個(gè)組件派歌,Tangram通過加載這個(gè)xml文件即可使用該xml文件所描術(shù)的組件弯囊,從而實(shí)現(xiàn)了動(dòng)態(tài)新增組件類型的功能。

參考文獻(xiàn):
參考地址:http://blog.csdn.net/carson_ho/article/details/79358486
Tangram:http://blog.csdn.net/carson_ho/article/details/72123380
VirtualView:http://pingguohe.net/2018/01/09/a-taste-of-virtualview-android.html
http://tangram.pingguohe.net/docs/basic-concept/history

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胶果,一起剝皮案震驚了整個(gè)濱河市匾嘱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌早抠,老刑警劉巖霎烙,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蕊连,居然都是意外死亡悬垃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門甘苍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尝蠕,“玉大人,你說我怎么就攤上這事载庭】幢耍” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵囚聚,是天一觀的道長(zhǎng)靖榕。 經(jīng)常有香客問我,道長(zhǎng)顽铸,這世上最難降的妖魔是什么茁计? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮跋破,結(jié)果婚禮上簸淀,老公的妹妹穿的比我還像新娘。我一直安慰自己毒返,他們只是感情好租幕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拧簸,像睡著了一般劲绪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天贾富,我揣著相機(jī)與錄音歉眷,去河邊找鬼。 笑死颤枪,一個(gè)胖子當(dāng)著我的面吹牛汗捡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畏纲,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扇住,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了盗胀?” 一聲冷哼從身側(cè)響起艘蹋,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎票灰,沒想到半個(gè)月后女阀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屑迂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年浸策,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惹盼。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡的榛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逻锐,到底是詐尸還是另有隱情,我是刑警寧澤雕薪,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布昧诱,位于F島的核電站,受9級(jí)特大地震影響所袁,放射性物質(zhì)發(fā)生泄漏盏档。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一燥爷、第九天 我趴在偏房一處隱蔽的房頂上張望蜈亩。 院中可真熱鬧,春花似錦前翎、人聲如沸稚配。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽道川。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冒萄,已是汗流浹背臊岸。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尊流,地道東北人帅戒。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像崖技,于是被迫代替她去往敵國(guó)和親逻住。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容