精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

久久综合九色综合欧美98| 国产亚洲福利| 精品欧美一区二区久久| 99热亚洲精品| 午夜激情在线观看| 99精品在线观看视频| 国产精品91免费在线| 国产高清在线免费观看| 国产伦精品一区二区三区千人斩 | 黄色片视频在线播放| 久久bbxx| 国产人妖乱国产精品人妖| 97久草视频| 在线免费av片| 媚黑女一区二区| 九九久久综合网站| 林心如三级全黄裸体| 欧美电影免费网站| 日韩欧美一区中文| 亚洲色图 在线视频| 国产精品蜜芽在线观看| 亚洲天堂中文字幕| 日韩欧美一区二区三区四区五区 | 久久久黄色大片| 尤物在线精品| 欧美成人精品在线播放| 国产福利在线导航| 亚洲人亚洲人色久| 日韩av在线一区| 成年女人免费视频| 91精品啪在线观看国产爱臀| 欧美日韩精品久久久| 熟妇人妻va精品中文字幕| 国精产品一区一区三区mba下载| 国产精品入口麻豆九色| 日韩国产高清一区| 成人影视在线播放| 国产日本欧美一区二区| 欧美另类一区| 天堂√在线中文官网在线| 成人av资源在线观看| 99在线视频免费观看| 国产美女无遮挡永久免费| 另类欧美日韩国产在线| 国产精品日韩在线播放| 亚洲午夜精品久久久| 日韩电影在线免费看| 日本国产欧美一区二区三区| 日韩在线视频免费播放| 亚洲一级高清| 97不卡在线视频| 色播视频在线播放| 宅男噜噜噜66国产日韩在线观看| 午夜精品久久久久久久99黑人| 欧美成人精品一区二区免费看片| 1024精品久久久久久久久| 久久精品视频一| 国产67194| 欧美日韩免费观看一区=区三区| 久久伊人精品天天| 欧美日韩免费做爰视频| 欧美精品综合| 国模私拍一区二区三区| 精品国产乱码一区二区| 亚洲深夜影院| 国产精品第2页| 888奇米影视| 国产一区二区三区高清播放| 97超级碰碰| 污视频在线免费观看| 97国产一区二区| 日本一区视频在线播放| 五月香视频在线观看| 亚洲精品视频自拍| 成熟丰满熟妇高潮xxxxx视频| 久久男人天堂| 欧美日韩国产精品成人| 夜夜爽久久精品91| 欧美人体视频| 日韩在线观看网站| 国产精品99精品| 久久久久久久欧美精品| 成人乱人伦精品视频在线观看| 亚洲成人久久精品| 国产亚洲欧美色| 成人在线观看毛片| 亚洲精品一级二级| 91精品国产一区二区人妖| 国产人成视频在线观看| 成人在线免费观看91| 欧美第一页在线| 不卡av电影在线| 国产精品一级片| 欧美日韩精品中文字幕一区二区| 在线a人片免费观看视频| 一区二区三区在线观看国产| 国语对白做受xxxxx在线中国| 国内精品视频| 国产亚洲精品久久久| 一区视频免费观看| 日韩av成人高清| 成人国产一区二区| 在线观看黄色av| 欧美日韩国产一区在线| 九九久久久久久| 精品国产视频| 97成人精品视频在线观看| 亚洲特级黄色片| 91在线观看视频| 9191国产视频| 色狠狠一区二区三区| 国产丝袜一区二区| 国产精品a成v人在线播放| 九色|91porny| 日韩一区二区电影在线观看| √最新版天堂资源网在线| 欧美伦理视频网站| 国产亚洲精品熟女国产成人| 亚洲区一区二| 成人黄视频免费| 欧美尤物美女在线| 在线欧美日韩国产| 国内精品久久99人妻无码| 好吊日精品视频| 91中文字幕在线| 色三级在线观看| 欧美在线一区二区| 午夜精产品一区二区在线观看的| 国产欧美午夜| 国产一区再线| 国产污视频在线播放| 精品国内片67194| 国产a免费视频| 国产原创一区二区| 中文字幕一区二区三区乱码| 影音成人av| 亚洲视频在线观看网站| 久久久免费高清视频| av电影天堂一区二区在线| 国产a级片网站| 国产精品极品国产中出| 久久久久国产一区二区三区| 99热这里只有精品在线| 亚洲乱码国产乱码精品精98午夜| 午夜精品免费看| 中文字幕一区二区三区乱码图片| 国产欧美va欧美va香蕉在| 婷婷五月在线视频| 欧美一区二区三区精品| 精品97人妻无码中文永久在线 | 91国产丝袜在线播放| 成人免费网站黄| 天堂va蜜桃一区二区三区| 久久久com| 在线观看欧美日韩电影| 国产亚洲欧洲在线| 一起草av在线| 亚洲女性喷水在线观看一区| a级大片免费看| 影音先锋久久| 免费亚洲精品视频| 欧美爱爱视频| 欧美国产一区二区三区| 五月天婷婷在线播放| 色综合天天做天天爱| 我不卡一区二区| 国产一区二区导航在线播放| 男人添女人荫蒂免费视频| 台湾亚洲精品一区二区tv| 日本人成精品视频在线| 美女免费久久| 精品国产91九色蝌蚪| 亚洲AV无码成人精品区东京热| 中文字幕欧美三区| 永久免费看片在线观看| 在线亚洲观看| 在线视频精品一区| 黄色欧美网站| 国产伦精品免费视频| 色婷婷在线播放| 亚洲欧美精品在线| 国产男女猛烈无遮挡| 欧美日韩国产精品| 来吧亚洲综合网| 91免费看片在线观看| 高清一区在线观看| 亚洲黄色免费| 亚洲三区在线观看| 天天久久夜夜| 91视频国产精品| 在线高清av| 欧美精品免费看| 韩国中文免费在线视频| 欧美成人精精品一区二区频| 国产性生活视频| 亚洲国产视频一区二区| 影音先锋制服丝袜| av午夜一区麻豆| 捷克做爰xxxⅹ性视频| 久久久久久黄| www.射射射| 亚洲最大av| 亚洲成人a**址| 日韩成人动漫在线观看| 99在线看视频| 伊人亚洲精品| 日韩av观看网址| a级片在线免费| 久久成人在线视频| 成a人v在线播放| 精品亚洲精品福利线在观看| a天堂在线观看视频| 欧美日韩在线播放三区四区| 国产欧美日韩另类| 亚洲在线成人精品| 国产激情无码一区二区三区| 久久精品一区四区| 9.1成人看片| 99精品偷自拍| 91人妻一区二区| 国产大陆精品国产| 制服丝袜中文字幕第一页 | 午夜久久久影院| 美女福利视频在线观看| 国产精品久久久一区麻豆最新章节| aaaaa一级片| 91女厕偷拍女厕偷拍高清| 日本不卡视频一区| 国产成人免费在线观看| 国产人妻精品久久久久野外| 韩国精品免费视频| 亚洲黄色av网址| 日韩成人一区二区| 白嫩少妇丰满一区二区| 亚洲欧美日本视频在线观看| 国产69精品久久久久999小说| 欧美激情第二页| 日韩中文在线字幕| 真实国产乱子伦精品一区二区三区| 亚洲欧美日韩在线综合| 日韩欧美视频| 亚洲v国产v在线观看| 精品久久91| 亚洲国产欧洲综合997久久 | 波多野结衣在线观看视频| 欧美午夜精品久久久久久人妖| 日韩欧美激情视频| 欧美性xxxxxxx| 欧美成人一区二区三区四区| 色美美综合视频| 中文字幕久久网| 欧美日韩国产片| 97人妻人人澡人人爽人人精品| 欧美另类z0zxhd电影| 国产乱码久久久久| 日韩欧美国产一二三区| 亚洲国产欧美另类| 亚洲高清久久久久久| 日韩午夜影院| 一本色道久久综合亚洲精品小说| 久久米奇亚洲| 日韩中文字幕在线| 污视频免费在线观看| 韩国精品久久久999| 中文字幕乱码在线播放| 国产极品jizzhd欧美| 欧美xxxx性| 官网99热精品| 蜜桃成人av| 黄色一级片网址| 亚洲精品孕妇| 欧美视频第三页| 国产在线不卡一区| 成年人的黄色片| 中文字幕精品三区| 69xx绿帽三人行| 色综合久久中文综合久久牛| 亚洲天堂狠狠干| 欧美精品一区二区三区四区| 男人天堂资源在线| 美女av一区二区| 午夜日韩成人影院| 亚洲一区久久久| 影视先锋久久| 欧美美女黄色网| 水野朝阳av一区二区三区| 992tv人人草| 久久久久国产精品麻豆ai换脸 | 成人久久久久久| 日韩欧美ww| ijzzijzzij亚洲大全| 99热免费精品| www.久久久久久久久久久| 91免费看片在线观看| 我要看黄色一级片| 色欧美日韩亚洲| 色网站免费观看| 久久伊人免费视频| 外国电影一区二区| 国产日韩精品推荐| 欧美一区亚洲| 91色国产在线| 99久久久免费精品国产一区二区| 特一级黄色录像| 欧美艳星brazzers| 在线观看xxx| 色综合天天狠天天透天天伊人| 精品成人av| 国产一区二区三区四区五区在线| 99视频精品全部免费在线视频| 欧洲av无码放荡人妇网站| 国产精品18久久久久久久网站| 亚洲AV无码成人精品区明星换面| 亚洲国产精品精华液网站| 国产又黄又猛又爽| 中文在线资源观看视频网站免费不卡 | 亚洲午夜免费| 法国空姐在线观看免费| 轻轻草成人在线| 亚洲理论片在线观看| 五月天丁香久久| 亚洲免费一级片| 欧美美女15p| 国产剧情一区二区在线观看| 午夜精品一区二区在线观看| 性欧美长视频| 亚洲av成人片色在线观看高潮| 亚洲天堂免费看| 国产又色又爽又黄又免费| 中文字幕在线精品| 综合在线影院| 欧洲在线视频一区| 久久九九国产| 五月天精品视频| 一本久久a久久免费精品不卡| 亚洲aⅴ乱码精品成人区| 91精品国产91久久久久久最新| 91欧美极品| 成人免费性视频| 成人黄色在线视频| 久久一级黄色片| 亚洲福利视频久久| 国产传媒av在线| 久久精彩视频| 丝袜美腿成人在线| 久久久精品成人| 欧美日韩国产综合一区二区| 黄色网在线播放| 亚洲综合最新在线| 国产精品观看| 一本色道综合久久欧美日韩精品| 日韩欧美精品中文字幕| 蜜芽tv福利在线视频| 国产精品爽爽ⅴa在线观看| 日韩精品二区| 下面一进一出好爽视频| 亚洲成人在线网站| 你懂的视频在线免费| 国产成人精品综合| 四季av在线一区二区三区| 天堂在线精品视频| 性欧美大战久久久久久久久| 视频一区二区在线播放| 国产精品福利网站| 国产精品久久久久久影院8一贰佰| 久久久精品视频国产| 亚洲成精国产精品女| 你懂的在线观看视频网站| 成人高h视频在线| 国内一区二区三区| 三叶草欧洲码在线| 精品视频免费看| 韩国成人免费视频| 日本一区视频在线播放| 国产激情视频一区二区三区欧美 | 国产精品免费一区二区三区四区| 午夜亚洲精品| 日本一级片免费| 亚洲成年人影院在线| 日本久久免费| 少妇久久久久久被弄到高潮| 91免费观看视频| 国产一区二区三区三州| 久久久久久中文| blacked蜜桃精品一区| 国产chinesehd精品露脸| 91激情在线视频| 日韩精品分区| 亚洲精品乱码视频| 成人午夜视频在线| 一二三区在线播放| 91po在线观看91精品国产性色| 久久婷婷蜜乳一本欲蜜臀| 亚洲中文字幕无码一区| 欧美剧在线免费观看网站| 1区2区在线| ijzzijzzij亚洲大全| 欧美激情综合在线| 欧美一区二区三区激情| 91九色单男在线观看|