導(dǎo)言
設(shè)配android的屏幕一定是一個噩夢,就好比那些搞網(wǎng)頁設(shè)計的為了折騰各種瀏覽器,廢寢忘食的去設(shè)配,其實(shí),這樣想想,設(shè)配android屏幕還真和那些網(wǎng)頁設(shè)計去設(shè)配瀏覽器沒啥區(qū)別…最近,在寫一套通過在view上綁定tag命令的小框架,特定的再回到API文檔中,找找那些沉睡在api文檔中好用的方法!
1.沒有一勞永逸的方案!
有經(jīng)常關(guān)注android官方文檔的,一定知道在android4.0發(fā)布不久,官方就推出了一套UI設(shè)計教程,
官方原版: Android Design
非官方簡體中文版: 非官方簡體中文版
6寸e-ink pdf版: 6寸版本
有人會說,這不是UI設(shè)計嗎?這是美工和設(shè)計干的事情,跟我們這些程序猿有什么關(guān)系!嚴(yán)重跑題!!!
關(guān)于一個程序猿要不要懂點(diǎn)設(shè)計,這個問題,不做討論,不過,個人經(jīng)驗(yàn),有時候,可能因此而靈感閃現(xiàn),解決了一個不大不小的問題.
很多人都嘗試在屏幕設(shè)配上,找出一條通用的解決方案,可惜的是,就算是官方也沒法提供這樣的幫助, 更別說我們這些苦逼的程序員,這里有個小故事,大家都知道Instagram,android版吧,有個采訪,Instagram的初始人就說,我每天收到最多的用戶反饋就是為什么不能在他的android手機(jī)上運(yùn)行,但是,我已經(jīng)設(shè)配了幾百個android手機(jī)了!!!
所以,想找出一條康莊大道幾乎是不太可能的事情,不過,我們可以修內(nèi)功,出現(xiàn)問題,不可怕,可怕的是出現(xiàn)問題無法解決,接下來,我就談?wù)勱P(guān)于屏幕設(shè)配的一些經(jīng)驗(yàn)之談.
2.這世界究竟有多少種屏幕?
我們每天都在究竟怎么去設(shè)配屏幕,那么這世上有多少屏幕要讓我們?nèi)ピO(shè)配呢?下面應(yīng)用了一個官方的最新資料:有興趣的可以直接到: 官方統(tǒng)計的屏幕分布
取之2012/5/7
ldpi mdpi hdpi xhdpi
small 2.3% 2.4%
normal 0.7% 26.2% 57.8% 0.9%
large 0.3% 2%
xlarge 7.4%
很多人第一次看這個圖的時候肯定會感到疑惑,怎么不是分辨率?這是什么鬼數(shù)據(jù),這讓人怎么去設(shè)配屏幕!買手機(jī)的時候可沒有人會說”你好,我要一個Normal大小屏幕,密度最好是hdpi的手機(jī)”.
描述過于模糊!!! 這可能是為什么設(shè)配android屏幕是一件很困難的事情,關(guān)于什么是Normal,什么是hdpi,如果,不清楚這點(diǎn)朋友,我建議先去看看官方文檔: Supporting Multiple Screens
有些東西竟然官方竟然告訴了我們,為啥還要去重復(fù)呢?
順便推薦一個算DPI的在線小工具: DPI Calculator / PPI Calculator 大概計算一下,當(dāng)前分辨率的手機(jī)處于哪個區(qū)間里面,至于詳情,我還是建議大家去看一下官方文檔,里面已經(jīng)說得很清楚了!!
竟然,官方文檔都寫好了,還有你寫來干嘛啊!那么接下來就開始說一些開發(fā)碰到的問題.
3.開始布一個局
1,新建一個android項(xiàng)目,把新建一個Activity那個選項(xiàng)選上!然后用模擬器運(yùn)行項(xiàng)目!什么?!!
你沒看錯,記住照著做就沒錯了…因?yàn)?今天,我們要講如何優(yōu)化和兼容View ,所以,一切從研究View開始!
2,打開hierarchyviewer
這是一個幫助我們優(yōu)化view的非常重要的工具的,接下來的大部分時間,都會借住這個工具進(jìn)行講解,這個工具沉睡在android sdk 目錄 tools下 hierarchyviewer.bat,或者用Everything這樣的搜索硬盤的工具直接找到!
3,分析
還記得我們第一步運(yùn)行的項(xiàng)目嗎?接著用hierarchyviewer這樣的神器,就可以導(dǎo)出這樣的圖!
這么一張圖就是我們一個Hello,World項(xiàng)目的View 布局結(jié)構(gòu),在HierarchyViewer上你點(diǎn)擊每個按鈕就會有非常詳細(xì)的布局信息,所以,這里對于hierarchyViewer的介紹到此為止!關(guān)于這個工具的詳細(xì)使用,請查閱 Debugging and Profiling User Interfaces 這里不做贅述!
4,如何布好一個局?
關(guān)于這點(diǎn)我在開發(fā)中總結(jié)了一下幾點(diǎn)
1.熟讀API文檔!
布局這東西不是比酷的東西,不是比誰的布局越復(fù)雜,那個人就越牛叉,以最少的步驟完成,設(shè)計圖的要求,這應(yīng)該是每個android開發(fā)程序員的宗旨!!
案例一:做一個帶箭頭的返回按鈕
經(jīng)理:那個小與啊,你根據(jù)這設(shè)計圖搞一個按鈕
小與:這還不簡單三分鐘搞定
于是小于程序猿,敲下了如下代碼
<RelativeLayout android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:gravity=" center " > <Button android:id=" @+id/button1 " android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/btn_headtita " android:textColor=" #ffffff " android:text=" @string/back " /> <ImageView android:id=" @+id/imageView1 " android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:layout_alignParentLeft=" true " android:layout_centerVertical=" true " android:src=" @drawable/header_back " /> </RelativeLayout>
看代碼多累啊,我們用剛剛介紹的hierarchyviewer來分析一下,這個按鈕有什么問題!我們從這個圖中,我們可以看到,為了這么一個按鈕我們用了view的三個節(jié)點(diǎn)去完成!假設(shè),我們的一個view 有三個類似的按鈕就意味著我們要用9個節(jié)點(diǎn)去完成,我們可以簡單得出這是一個3N級的復(fù)雜度布局,我們可以嘗試去優(yōu)化嗎?
技巧一:熟讀官方的API文檔!
個人建議,常用的Widget的所有參數(shù)都盡量了解一遍!在閱讀官方文檔的時候我們發(fā)現(xiàn)了Button,有一個可以把圖繪制在左邊的參數(shù):android:drawableLeft
于是,我們優(yōu)化了一下小與的代碼
< Button android : id = "@+id/button1" android : layout_width = "wrap_content" android : layout_height = "wrap_content" android : background = "@drawable/btn_headtita" android : drawableLeft = "@drawable/header_back" android : gravity = "center" android : padding = "10dp" android : text = "@string/back" android : textColor = "#ffffff" />
用hierarchyviewer來分析一下瞬間一個3N級復(fù)雜度的布局,變成了一個N級復(fù)雜的!所以,我建議各位android開發(fā)朋友,在考慮優(yōu)化的時候先把a(bǔ)pi文檔里面的內(nèi)容爛熟與心,不然,這樣折騰下去,很浪費(fèi)時間!
有細(xì)心的朋友可能會問: android : padding = "10dp" 這個用來做什么了?
我先告訴大家,不用這個參數(shù):你將會看到:
用了以后:
這下大家能夠明白了吧?
所以,當(dāng)你在進(jìn)行布局的時候,如果碰到比較繁瑣的時候,你先想想會不會已經(jīng)API本身就有這樣的參數(shù)呢?
簡單是所有布局開始最重要的原則!
簡單意味著不容易出現(xiàn)兼容問題!
簡單意味著性能不錯!
2.模塊化布局
所謂,模塊化布局就是要你熟悉使用<include /> 這個標(biāo)簽!
一個經(jīng)典的Tab類布局由三部分組成,我們可以根據(jù)這三部分創(chuàng)建三個可以重用的布局
head_menu.xml
content_showweibo.xml
bottom_menu.xml
然后我們可以很靈活的組合我們要顯示的,例如要完成上面的那個weibo布局
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns : android = "http://schemas.android.com/apk/res/android" android : layout_width = "fill_parent" android : layout_height = "fill_parent" android : orientation = "vertical" > < include android : id = "@+id/head_menu" layout = "@layout/head_menu" /> < include android : id = "@+id/content" layout = "@layout/content_showweibo" /> < include android : id = "@+id/bottom_menu" layout = "@layout/bottom_menu" /> </ LinearLayout >
熟練的使用<include />標(biāo)簽就可以大大的減少我們?nèi)蘸蠖季S護(hù)工作!
3.合并沒必要的節(jié)點(diǎn)
還記得我們一開始的那個項(xiàng)目嗎?
在高效布局里面,有一條準(zhǔn)則就是,盡量的減少節(jié)點(diǎn)!!!!如圖,我們發(fā)現(xiàn),其實(shí)LinearLayout其實(shí)啥都沒干,我們卻耗費(fèi)了那么一點(diǎn)性能去繪制了這么沒用的節(jié)點(diǎn)!
接下來,我們?yōu)榱讼麥邕@個節(jié)點(diǎn),我們需要一個這么的標(biāo)簽
<merge ></merge>
修改咱們的代碼讓它,性能更好!
<? xml version="1.0" encoding="utf-8" ?> < merge xmlns : android = "http://schemas.android.com/apk/res/android" > < Button android : id = "@+id/button1" android : layout_width = "wrap_content" android : layout_height = "wrap_content" android : background = "@drawable/btn_headtita" android : drawableLeft = "@drawable/header_back" android : gravity = "center" android : layout_gravity = "center_vertical|center_horizontal" android : padding = "10dp" android : text = "@string/back" android : textColor = "#ffffff" /> </ merge >
打開hierarchyviewer 一看!
哦也!優(yōu)化了一個節(jié)點(diǎn)!并且顯示快了那么一點(diǎn)點(diǎn)...
5.總結(jié)
講了,這么一大堆東西,貌似,沒怎么如何去優(yōu)化?都是在說一些操作性的東西,其實(shí),這世上沒有絕對的優(yōu)化方案,所謂的優(yōu)化方案都是基于一個最初的基本原則出發(fā),例如,內(nèi)存用得再少一點(diǎn)!那么如何才能將這內(nèi)存用得再少一點(diǎn)做的了,這樣就需要一些最基本的方法,關(guān)于布局這部分的基本方法,我在上面已經(jīng)很詳細(xì)的說了一遍了,當(dāng)進(jìn)行布局的時候你要牢記
1,盡量使用view自身的參數(shù)
2,減少一個布局的不必要節(jié)點(diǎn)
3,盡量重用一個布局文件
兼容問題呢?兼容問題出現(xiàn)的原因千奇百怪,沒有一套通用的法則!關(guān)于這點(diǎn)談一下自己的看法
1,減少復(fù)雜度,往往,兼容問題的出現(xiàn),就是布局太復(fù)雜了,例如,我舉的那個按鈕布局,本來一個View就能完成,你卻用了三個view完成,在使用的時候,出現(xiàn)問題的概念也大幅度提升!所以,布局以簡單為本,那樣兼容問題就可以盡量避免!
2,熟練使用工具,還記得hierarchyviewer 嗎?當(dāng)出現(xiàn)兼容問題的時候,用這個軟件可以快速定位到錯誤位置!
順便說一下…
如果你覺得這篇文章幫到你…剛好你又有一個eoeandroid的賬號…那就去支持一下吧…
作者:游戲阿柴
出處:http://www.cnblogs.com/youxilua
本文采用
知識共享署名-非商業(yè)性使用-相同方式共享 2.5 中國大陸許可協(xié)議
進(jìn)行許可,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
微博聯(lián)系:
新浪微博
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
