精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入解析Android的自定義布局

移動開發(fā) Android
這篇文章是前Firefox Android工程師(現(xiàn)在跳槽去Facebook了) Lucas Rocha所寫,文中對Android中常用的四種自定義布局方案進行了很好地分析,并結(jié)合這四種Android自定義布局方案所寫的示例項目講解了它們各自的優(yōu)劣以及四種方案之間的比較。

[[124174]]

寫在前面的話:

這篇文章是前Firefox Android工程師(現(xiàn)在跳槽去Facebook了) Lucas Rocha所寫,文中對Android中常用的四種自定義布局方案進行了很好地分析,并結(jié)合這四種Android自定義布局方案所寫的示例項目講解了它們各自的優(yōu)劣以及四種方案之間的比較。看完這篇文章,也讓我對Android 自定義布局有了進一步的了解,于是趁著興頭,我把它翻譯成中文,原文鏈接在此

只要你寫過Android程序,你肯定使用過Android平臺內(nèi)建的幾個布局——RelativeLayout, LinearLayout, FrameLayout等等。 它們能幫助我們很好的構(gòu)建Android UI。

這些內(nèi)建的布局已經(jīng)提供了很多方便的構(gòu)件,但很多情況下你還是需要來定制自己的布局。

總結(jié)起來,自定義布局有兩大優(yōu)點:

  1. 通過減少view的使用和更快地遍歷布局元素讓你的UI顯示更加有效率;
  2. 可以構(gòu)建那些無法由已有的view實現(xiàn)的UI。

在這篇博文中,我將實現(xiàn)四種不同的自定義布局,并對它們的優(yōu)缺點進行比較。它們分別是: composite view, custom composite view, flat custom view, 和 async custom views。

這些代碼實現(xiàn)可以在我的github上的 android-layout-samples 項目里找到。這個app使用上面說到的四種自定義布局實現(xiàn)了相同的UI效果。它們使用 Picasso 來加載圖片。這個app的UI只是twitter timeline的簡化版本——沒有交互,只有布局。

好啦,我們先從最常見的自定義布局開始吧: composite view。

Composite View

Composite views (也被稱為 compound views) 是眾多將多個view結(jié)合成為一個可重用UI組件的方法中最簡單的。這種方法的實現(xiàn)過程是這樣的:

  1. 繼承相關(guān)的內(nèi)建的布局。
  2. 在構(gòu)造函數(shù)里面填充一個 merge 布局。
  3. 初始化成員變量并通過 findViewById()指向內(nèi)部view。
  4. 添加自定義的API來查詢和更新view的狀態(tài)。

TweetCompositeViewcode 就是一個 composite view。它繼承于 RelativeLayout,并填充了 tweet_composite_layout.xmlcode 布局文件,***向外界暴露了 update()方法來更新它在adaptercode里面的狀態(tài)。

Custom Composite View

上面提到的TweetCompositeView 這種實現(xiàn)方式能滿足大部分的情況。但是碰到某些情況就不靈了。假設(shè)你現(xiàn)在想要減少子視圖的數(shù)量,讓布局元素的便利更加有效。

這個時候我們可以回過頭來看看,盡管 composite views 實現(xiàn)起來比較簡單,但是使用這些內(nèi)建的布局還是有不少的開銷的——特別是 LinearLayout 和RelativeLayout這種比較復(fù)雜的容器。由于Android平臺內(nèi)建布局的實現(xiàn),在一次布局元素遍歷中,系統(tǒng)需要處理許多布局的結(jié)合和子視圖的多次測量——LinearLayout的 layout_weight 的屬性就是常見例子。

因此你可以為你的app量身定做一套子視圖的計算和定位邏輯,這樣的話你就可以極大的優(yōu)化你的UI了。這種做法就是我接下來要介紹的 custom composite view.

顧名思義,一個 custom composite view 就是一個重寫了onMeasure() 和onLayout() 方法的 composite view 。因此相比之前的composite view繼承了 RelativeLayout,現(xiàn)在我們需要更進一步——繼承更抽象的ViewGroup。

TweetLayoutViewcode 就是通過這種技術(shù)實現(xiàn)的。注意現(xiàn)在這個實現(xiàn)不像 TweetComposiveView 繼承了LinearLayout ,這也就避免了 layout_weightcode這個屬性的使用了。

這個大費周折的過程通過ViewGroup’s 的measureChildWithMargins() 方法和背后的 getChildMeasureSpec() 方法計算出了每個子視圖的 MeasureSpec 。

TweetLayoutView 不能正確地處理所有可能的 layout 組合但是它也不必這樣。我們肯定需要根據(jù)特定需求來優(yōu)化我們的自定義布局,這種方式可以讓我們寫出簡單高效的布局代碼。

Flat Custom View

如你所見,custom composite views 可以簡單地通過使用ViewGroup 的API就可以實現(xiàn)了。大部分時候,這種實現(xiàn)是可以滿足我們的需求的。

然而我們想更進一步的話——優(yōu)化我們應(yīng)用中的關(guān)鍵部分UI,比如 ListViews ,ViewPager等等。如果我們把所有的 TweetLayoutView 子視圖合并成一個單一的自定義視圖然后統(tǒng)一管理會怎么樣呢?這就是我們接下來要討論的 flat custom view——參看下面的圖片。

layouts

左邊為CUSTOM COMPOSITE VIEW ,右邊是FLAT CUSTOM VIEW

flat custom view 就是一個完全自定義的 view ,它完全負責內(nèi)部的子視圖的計算,位置安排,繪制。所以它就直接繼承了View 而不是 ViewGroup。

如果你想找找現(xiàn)實生活中app是否存在這樣的例子,很簡單——開啟你手機“開發(fā)者模式”里面的 “顯示布局邊界”選項,然后打開 Twitter, Gmail, 或者 Pocket這些app,它們在列表UI里面都采用了 flat custom view。

使用 flat custom view最主要的好處就是可以極大地壓縮app 的視圖層級,進而可以進行更快的布局元素遍歷,最終可以減少內(nèi)存占用。

Flat custom view 可以給你***的自由,就好像你在一張白紙上面作畫。但是這樣的自由是有代價的:你不能使用已有的那些視圖元素了,比如 TextView 和 ImageView。沒錯,在 Canvas 上面描繪文本 的確很簡單,但要你實現(xiàn) ellipsizing(就是對過長的文本截斷)呢?同樣, 在 Canvas 上面 描繪圖片確很簡單,但是如何縮放呢?這些限制同樣適用于touch events, accessibility, keyboard navigation等等。

所以使用flat custom view的底線就是:只將flat custom view應(yīng)用于你的app的UI核心部分,其他的就直接依賴Android平臺提供的view了。

TweetElementViewcode 就是 flat custom view。為了更容易的實現(xiàn)它,我創(chuàng)建了一個小小的自定義視圖框架叫做UIElement。你可以在  canvascode 這個包里找到它。

UIElement 提供了和Android平臺類似的 measure/layout API 。它包含了沒有圖像界面的 TextView 和 ImageView ,這兩個元素包含了幾個必需的特性——分別參看 TextElementcode 和ImageElementcode 。它還擁有自己的 inflatercode ,幫助從 布局資源文件code里面實例化UIElement  。

注意: UIElement 還處于非常早期的開發(fā)階段,所以還有很多缺陷,不過將來隨著不斷的改進UIElement 可能會變得非常有用。

你可能覺得TweetElementView 的代碼看起來很簡單,這是因為實際代碼都在 TweetElementcode里面——實際上TweetElementView 扮演托管的角色code

TweetElement  里面的布局代碼和TweetLayoutView‘非常類似,但是它使用 Picasso 請求圖片時卻不一樣code ,因為TweetElement  沒有使用ImageView。

Async Custom View

總所周知,Android UI 框架時單線程的 。 這樣的單線程會帶來一些限制。比如,你不能在主線程之外遍歷布局元素——然而這對復(fù)雜、動態(tài)的UI是很有益處的。

假如你的app 在一個ListView 中很布局比較復(fù)雜的條目(就像大多數(shù)社交app一樣),那么你在滑動ListView 就很有可能出現(xiàn)跳幀的現(xiàn)象,因為ListView 需要為列表中即將出現(xiàn)的新內(nèi)容計算它們的視圖大小code和布局code。同樣的問題也會出現(xiàn)在GridViews,ViewPagers等等。

如果我們可以在主線程之外的線程上面對那些還沒有出現(xiàn)的子視圖進行布局遍歷是不是就可以解決上面的問題了?也就是說,在子視圖上面調(diào)用 measure() 和layout() 方法都不會占用主線程的時間了。

所以 async custom view 就是一個允許子視圖布局遍歷過程發(fā)生在主線程之外的實驗,這個idea是受到Facebook的Paperteam async node framework 這個視頻激發(fā)所想到的。

既然我們在主線程之外永遠接觸不到Android平臺的UI組件,因此我們需要一個API在不能直接接觸到這個視圖的前提下對這個視圖的內(nèi)容進行測量、布局。這恰恰就是 UIElement 框架提供給我的功能。

AsyncTweetViewcode 就是一個 async custom view。它使用了一個線程安全的 AsyncTweetElementcode 工廠類code 來定義它的內(nèi)容。具體過程是一個 Smoothie 子項加載器code 在一個后臺線程上對暫時不可見的AsyncTweetElement 進行創(chuàng)建、預(yù)測量和緩存(在內(nèi)存里面,以便后來直接使用)。

當然在實現(xiàn)這個異步UI的過程中我還是妥協(xié)了一些,因為你不知道如何顯示任意高度的布局占位符。比如,當布局異步傳遞過來的時候你只能在后臺線程對它們的大小進行一次更改。因此當一個 AsyncTweetView 就要顯示的時候卻無法在內(nèi)存里面找到合適的AsyncTweetElement ,這個時候框架就會強制在主線程上面創(chuàng)建一個AsyncTweetElement code

還有,預(yù)先加載的邏輯和內(nèi)存緩存過期時間設(shè)置都需要比較好的實現(xiàn)來保證在主線程盡可能多地利用內(nèi)存里面的緩存布局。比如,這個方案中使用 LRU 緩存code 就不是一個明智的選擇。

盡管還存在這些限制,但是使用 async custom view 的得到的初步結(jié)果還是很有前途的。當然我也會通過重構(gòu)這個UIElement  框架和使用其他類別的UI在這個領(lǐng)域繼續(xù)探索。讓我們靜觀其變吧。

總結(jié)

在我們涉及到布局的時候,我們自定義的越深,我們能從Android平臺所能獲得的依賴就越少。所以我們也要避免過早優(yōu)化,只在確實能實實在在改善app質(zhì)量和性能的區(qū)域進行完全的布局自定義。

這不是一個非黑即白的決定。在使用平臺提供的UI元素和完全自定義的兩種極端之間還有很多方案——從簡單的composite views 到復(fù)雜的 async views。實際項目中,你可能會結(jié)合文中的幾種方案寫出優(yōu)秀的app。

責任編輯:閆佳明 來源: greenrobot.me
相關(guān)推薦

2010-08-11 09:01:41

Flex4布局

2016-12-26 15:25:59

Android自定義View

2016-11-16 21:55:55

源碼分析自定義view androi

2021-08-16 14:45:38

鴻蒙HarmonyOS應(yīng)用

2013-04-01 14:35:10

Android開發(fā)Android自定義x

2024-02-22 08:06:45

JSON策略解析器

2016-04-12 10:07:55

AndroidViewList

2017-05-19 10:03:31

AndroidBaseAdapter實踐

2010-02-07 14:02:16

Android 界面

2017-05-18 12:36:16

android萬能適配器列表視圖

2012-12-24 14:42:48

iOS自定義狀態(tài)欄

2025-01-10 09:28:25

2011-04-27 10:31:38

Java

2016-08-18 13:56:33

AndroidExecutorsubmit

2015-02-12 15:33:43

微信SDK

2010-07-22 09:25:21

Symbian開發(fā)

2021-11-30 11:17:23

自定義配置插件

2018-07-06 15:58:34

SpringSchemaJava

2015-01-14 15:06:48

定義相機

2013-01-09 17:22:38

Android開發(fā)Camera
點贊
收藏

51CTO技術(shù)棧公眾號

国产又爽又黄网站亚洲视频123| 少妇高潮一区二区三区喷水| 澳门成人av网| 国产日韩欧美精品电影三级在线| 国产精品视频网| 青青草精品在线视频| 天堂99x99es久久精品免费| 色八戒一区二区三区| 成年人黄色在线观看| 亚洲精品国产手机| 三级在线观看一区二区| 久久五月情影视| 国产中文字幕一区二区| 日韩中文视频| 樱桃国产成人精品视频| 久久久综合香蕉尹人综合网| 亚洲无码久久久久久久| 最新亚洲视频| 日韩视频免费大全中文字幕| 成熟妇人a片免费看网站| 日本欧美一区| 午夜精品aaa| youjizz.com亚洲| 日本私人网站在线观看| 国产精品一区二区三区99| 欧美一级专区| 日韩av影院在线观看| 精品亚洲一区二区三区四区| 涩涩视频在线免费看| 亚洲美腿欧美偷拍| 天堂精品一区二区三区| 亚洲 欧美 激情 另类| 国产在线不卡视频| 国产精品视频导航| 成年人av网站| 一区二区三区四区五区精品视频 | 老司机成人在线| 欧美人妇做爰xxxⅹ性高电影 | 免费高清成人在线| 91成人天堂久久成人| 欧美日韩偷拍视频| 亚洲成人日韩| 日韩在线视频导航| 欧美黄色一级生活片| 久久综合五月婷婷| 精品国产免费人成在线观看| 国内av一区二区| 韩国精品视频在线观看| 欧美怡红院视频| 国产精品天天av精麻传媒| 两个人看的在线视频www| 一级中文字幕一区二区| 久久国产精品免费观看| 国产视频在线播放| 中文字幕制服丝袜成人av | 亚洲综合激情小说| 9191国产视频| 欧美xxx黑人xxx水蜜桃| 亚洲精品国产a| av久久久久久| 国内在线免费视频| 香蕉影视欧美成人| 男人和女人啪啪网站| 色综合桃花网| 狠狠爱在线视频一区| 丰满人妻中伦妇伦精品app| 午夜激情电影在线播放| 色综合久久精品| 国产精品天天av精麻传媒| 国产精品伦一区二区| 欧美军同video69gay| 亚洲综合123| 97久久综合精品久久久综合| 亚洲国产成人精品久久久国产成人一区| jjzz黄色片| 日韩美女毛片| 在线观看欧美视频| 老熟妇高潮一区二区三区| 欧美一区二区| 97在线视频免费观看| 狠狠人妻久久久久久| 奇米888四色在线精品| 成人网在线免费观看| 亚洲国产精品二区| 久久久三级国产网站| 神马欧美一区二区| av官网在线播放| 午夜久久久久久久久| 久章草在线视频| 欧美久久久网站| 精品欧美一区二区在线观看| 特级西西人体wwwww| 日韩欧美精品综合| 欧美精品第一页在线播放| 国产超碰人人爽人人做人人爱| 日韩电影网1区2区| 91久久爱成人| 国产香蕉在线| 亚洲激情中文1区| 怡红院av亚洲一区二区三区h| 成人在线高清| 精品国产乱码久久| 四季av中文字幕| 国内精品久久久久国产盗摄免费观看完整版| 91av在线免费观看| 一级片视频免费| av资源网一区| 免费在线观看污污视频| 在线能看的av网址| 日韩一区二区在线观看视频播放| av网站有哪些| 午夜精品电影| 偷窥少妇高潮呻吟av久久免费| 国产suv精品一区二区| 中文字幕在线观看1| 波多野结衣亚洲一区| 在线不卡日本| 精品国产免费人成网站| 日韩欧美电影一区| av在线播放中文字幕| 9色精品在线| 91夜夜揉人人捏人人添红杏| 黄色在线网站| 精品久久久中文| 无套内谢丰满少妇中文字幕| 国产日韩视频在线| 久久免费少妇高潮久久精品99| 一本久道久久综合无码中文| 99re这里只有精品6| 中国一级黄色录像| 精品176极品一区| 亚洲日韩中文字幕在线播放| www.av视频在线观看| 国内成+人亚洲+欧美+综合在线| 美乳视频一区二区| 草草视频在线| 精品国产自在久精品国产| 青花影视在线观看免费高清| 日本午夜一区二区| 欧美资源一区| 都市激情亚洲一区| 精品中文字幕久久久久久| 国产精品成人网站| 国产99久久久精品| 91亚洲精品国产| 日韩激情精品| 欧美区二区三区| 国产av无码专区亚洲av麻豆| 最好看的中文字幕久久| 污污网站在线观看视频| 日韩国产一区| 国产日韩精品在线观看| а√天堂中文在线资源bt在线| 色婷婷综合久久| 在线观看日本中文字幕| 亚洲欧美卡通另类91av| 久久综合毛片| 成人免费看视频网站| 日韩精品一二三四区| 国产小视频在线免费观看 | 一级黄色片大全| 亚洲综合日韩| 天堂va久久久噜噜噜久久va| 国产成人精品一区二区三区在线| 中国china体内裑精亚洲片| 在线观看国产区| 国产精品伦理在线| 亚洲第一天堂久久| 欧美日韩亚洲一区| 国产欧美日韩综合一区在线观看 | 日韩美女写真福利在线观看| 国产一区二区影视| 欧美日本韩国一区二区三区视频| 粉嫩av性色av蜜臀av网站| 国产成人免费在线观看不卡| 精品丰满人妻无套内射| 日韩在线影视| 国产精品日韩专区| a视频在线免费看| 亚洲国产精品人久久电影| 久久一区二区三区视频| 国产日产欧美一区二区三区| 亚洲 国产 图片| 欧美日本三区| 久久av免费观看| 成人在线免费| 欧美黑人性生活视频| 深夜福利视频一区| 欧美福利一区二区| 日本午夜精品理论片a级app发布| 久久久午夜精品| 91蝌蚪视频在线| 国产日韩高清一区二区三区在线| 四虎永久国产精品| 亚洲2区在线| 日本不卡视频在线播放| 麻豆传媒视频在线观看| 亚洲国内精品在线| 91超薄丝袜肉丝一区二区| 精品成人乱色一区二区| 1024在线看片| hitomi一区二区三区精品| 国产精品v日韩精品v在线观看| 欧美日韩国产亚洲一区| 欧洲高清一区二区| 欧一区二区三区| 国产成人激情小视频| av网站免费在线观看| 亚洲欧美资源在线| 亚洲精品福利网站| 欧美色倩网站大全免费| 91porny在线| 亚洲精品v日韩精品| 一级片久久久久| va亚洲va日韩不卡在线观看| 欧美一级免费观看| 青青草偷拍视频| 国产欧美精品一区二区色综合| 日批视频免费看| 蜜臀精品久久久久久蜜臀| 极品美女扒开粉嫩小泬| 欧美777四色影| 一本一本a久久| 欧美人妖在线| 激情久久av| 99热这里只有精品首页| 91手机视频在线观看| 日本综合视频| 欧美主播福利视频| av第一福利在线导航| 欧美成人黑人xx视频免费观看| av片在线看| 亚洲人成网站777色婷婷| 少妇高潮久久久| 欧美大片拔萝卜| 99久久久无码国产精品免费| 欧美日韩一区二区电影| 男操女视频网站| 91久久久免费一区二区| 麻豆成人免费视频| 精品高清美女精品国产区| 久久精品波多野结衣| 亚洲欧美激情小说另类| 91 在线视频| 亚洲日本中文字幕区| 欧美风情第一页| 亚洲天堂精品视频| 一区二区国产精品精华液| 亚洲欧美综合在线精品| 中文国语毛片高清视频| 国产精品久久久久四虎| 香蕉成人在线视频| 亚洲欧美电影一区二区| 暗呦丨小u女国产精品| 亚洲码国产岛国毛片在线| 国产一二三区精品| 夜夜精品浪潮av一区二区三区| 男人操女人的视频网站| 亚洲日本在线视频观看| 青青草手机在线观看| 午夜亚洲福利老司机| 国产视频91在线| 欧美色xxxx| 6080午夜伦理| 欧美性欧美巨大黑白大战| 一区二区三区免费在线| 欧美一卡二卡三卡四卡| 黄频在线免费观看| 精品中文视频在线| 亚洲成a人v欧美综合天堂麻豆| 一区二区av在线| 蜜芽在线免费观看| 久久91精品国产91久久久| 182在线播放| 国产v综合v亚洲欧美久久| 国外成人福利视频| 国产98在线|日韩| 亚洲人成网亚洲欧洲无码| 婷婷精品国产一区二区三区日韩 | 久久久免费人体| 91亚洲国产精品| 老司机在线精品视频| 神马影院我不卡午夜| 欧美精品不卡| 欧美日韩第二页| 国产乱人伦偷精品视频免下载 | 国内自拍在线观看| 蜜臀av一区二区在线观看| 韩国av中国字幕| 久久久久国产精品人| 丝袜 亚洲 另类 欧美 重口 | 午夜视频网站在线观看| 日韩一区二区三区视频在线| 天堂在线中文字幕| www.午夜精品| 一区二区电影免费观看| 3d蒂法精品啪啪一区二区免费| 香蕉视频一区| 成人高清dvd| 日韩国产高清在线| 野战少妇38p| 中文字幕日韩一区| 中文字字幕在线中文| 日韩一区二区三区视频在线 | 无码粉嫩虎白一线天在线观看| 日韩精品一区第一页| 欧美双性人妖o0| 中文字幕在线视频一区| 中文字幕精品无码一区二区| 日韩一区二区三区在线视频| 国产51人人成人人人人爽色哟哟| 欧美精品成人91久久久久久久| 欧美在线一级| 日本一区免费在线观看| 亚洲日本黄色| 91香蕉视频免费看| 国产精品无人区| 日韩精品一区二区亚洲av| 精品久久久久久久久久久久久久久| melody高清在线观看| 66m—66摸成人免费视频| 国产一区2区在线观看| 五月天色一区| 久久狠狠一本精品综合网| 国产精品日日摸夜夜爽| 日韩一区欧美一区| 少妇无套内谢久久久久| 亚洲欧美福利视频| 狠狠操一区二区三区| 97人人模人人爽视频一区二区| 久久一区91| 在线观看高清免费视频| 久久久久综合网| 永久久久久久| 欧美成人免费全部网站| 欧美高清性xxxxhd| 亚洲少妇一区| 国产精品久久久久久亚洲色| 亚洲精品免费在线播放| 97人妻精品一区二区三区| 中文字幕精品国产| 电影一区电影二区| 日本一区二区三区免费看 | 亚洲最大综合网| 久久久亚洲精品一区二区三区| 国产99久久久| 亚洲欧美日韩中文视频| 欧美色999| 亚洲v国产v| 久久精品久久99精品久久| 国产小视频你懂的| 欧美久久久久中文字幕| 黄色网址在线免费播放| 91人人爽人人爽人人精88v| 欧美一区激情| 韩国三级视频在线观看| 午夜影院久久久| 水莓100在线视频| 日韩av色综合| 日韩88av| 黄色三级视频在线播放| 一二三四区精品视频| 四虎精品在永久在线观看 | 可以免费在线观看的av| 亚洲美女精品成人在线视频| 国产精品一区二区av影院萌芽| 品久久久久久久久久96高清| 男人的j进女人的j一区| 欧美偷拍第一页| 亚洲国产欧美精品| av激情成人网| 永久域名在线精品| 成人黄色网址在线观看| 亚洲视频 欧美视频| 日韩在线视频观看正片免费网站| 欧美日本三级| 天堂…中文在线最新版在线| 国产喂奶挤奶一区二区三区| 亚洲天堂狠狠干| 欧美—级a级欧美特级ar全黄| 欧美日韩另类图片| 一区二区三区入口| 亚洲激情一二三区| 欧洲毛片在线| 成人黄色大片在线免费观看| 亚洲国产裸拍裸体视频在线观看乱了中文 | 免费h在线看| 亚洲国产精品一区在线观看不卡 | 成年网站在线| 91精品国产综合久久久久久丝袜 | 欧美激情视频一区| 免费欧美一区| 中文字幕第10页| 日韩欧美亚洲范冰冰与中字| 激情在线小视频| 女女同性女同一区二区三区91| 久久 天天综合| 国产精品国产三级国产专区52| 久久久av免费| 综合干狼人综合首页|