Android UI適配總結(jié)之尺寸適配(2)

很想和你們嘮叨幾句突雪,聊聊入行后我下移的發(fā)際線是怎么做到的什黑!奈何不善言談崎淳,雖心有千言萬語,竟只能對著屏幕嘆一聲下次再聊愕把。
本人學(xué)識有限拣凹,錯(cuò)誤之處還望各位大佬斧正。[]( ̄▽ ̄)*下面進(jìn)入正題恨豁。

1.使用dp嚣镜、sp、wrap_content橘蜜、match_parent
2.布局中使用weight或者ConstraintLayout等靈活布局
3.通配符適配菊匿,如:layout-sw320dp、values-sw320dp
4.頭條方案

使用1计福、2兩種方法跌捆,也是我們開發(fā)中最常用的方法,基本能滿足我們大部分(80%左右)機(jī)型的適配棒搜,但是還有小部分的機(jī)型顯示會(huì)出現(xiàn)問題疹蛉,這時(shí)候我們就要用到了3活箕、4兩種方法的一種力麸。

通配符

先來說說通配符,通配符適配是Google早期為了能讓APP能同時(shí)適配手機(jī)和平板而提供的功能育韩,后被用于解決Android手機(jī)屏幕尺寸碎片化引起的適配問題克蚂。

通配符的格式:文件名+通配符限制,中間用“-”連接筋讨。
我們常用的分辨率適配:drawbale-1920*1080埃叭、drawbale-1280*720等
寬度適配:values-sw320dp、values-sw360dp等

├── src/main
│   ├── res
│   ├── ├──values
│   ├── ├──values-sw320dp
│   ├── ├──values-sw360dp
│   ├── ├──values-sw400dp
│   ├── ├──values-sw411dp
│   ├── ├──values-sw480dp
│   ├── ├──...
│   ├── ├──values-sw600dp
│   ├── ├──values-sw640dp

上面是我公司項(xiàng)目使用的通配符適配目錄悉罕。是不是很熟悉赤屋?沒錯(cuò)跟狱,這個(gè)基本是個(gè)固定的目錄格式味榛,已經(jīng)有大神幫我設(shè)計(jì)好了,我們只要照搬這個(gè)目錄就可以了篓像。(你要是覺的不夠精細(xì)嗜逻,可以自己增加 ̄▽ ̄)既然我們用了通配符涩僻,那么values中的dimens.xml想必是不一樣(*^▽^*),下面我舉個(gè)例子來說明dimens中值是怎么計(jì)算出來的!
假設(shè)UI給的設(shè)計(jì)圖尺寸是1280*750逆日,我要計(jì)算的是sw320dp-》dimens
屏幕寬度320dp嵌巷、設(shè)計(jì)圖750px,
如果要把屏幕占滿我們需要設(shè)置view的寬度為320dp或者750px室抽、
如果占一半view的寬度為160dp或者375px搪哪、
依次類推我們能看出dp和px之間的比例是固定的320/750=160/375....=0.43。也就是說1px=0.43dp坪圾∝溃總體來看就是我們把320dp的屏幕分成了750份,用每份來替換dp值(如:1px(pb_px_1)=0.43dp)神年。

<dimen name="base_dpi">320dp</dimen>
<dimen name="qb_px_0">0.00dp</dimen>
<dimen name="qb_px_1">0.43dp</dimen>
<dimen name="qb_px_2">0.85dp</dimen>
<dimen name="qb_px_3">1.28dp</dimen>
<dimen name="qb_px_4">1.71dp</dimen>
<dimen name="qb_px_5">2.13dp</dimen>
<dimen name="qb_px_6">2.56dp</dimen>
<dimen name="qb_px_7">2.99dp</dimen>
<dimen name="qb_px_8">3.41dp</dimen>
<dimen name="qb_px_9">3.84dp</dimen>
...
<dimen name="qb_px_719">306.77dp</dimen>
<dimen name="qb_px_720">307.20dp</dimen>
...
<dimen name="qb_px_750">320dp</dimen>

同理已维,sw360dp也是把屏幕分成750份、每份360/750=0.48
Android Studio自動(dòng)生成dimens插件下載
由于Android的碎片化已日,會(huì)有各種稀奇古怪的手機(jī)寬度是上面沒有的通配寬度垛耳,(sw -> small width 最小寬度通配符) ,遇到這種情況系統(tǒng)會(huì)自動(dòng)幫我想下查找最近的通配寬度飘千。
假如有一臺(tái)340dp的手機(jī)堂鲜,而我們的統(tǒng)配符有沒有340dp,那么會(huì)自動(dòng)先下查找到并使用sw320dp的參數(shù)护奈。但是我們手機(jī)的寬度明明是340dp缔莲,卻用的320dp的參數(shù),這不是產(chǎn)生了誤差霉旗。沒錯(cuò)痴奏,但是這種誤差基本可以忽略,下面我們來簡單算算厌秒。
340/750=0.45
320/750=0.43
如果一個(gè)view的高度是30dp读拆,那么兩者的誤差為0.6dp,0.6/30*100=2%
一個(gè)30dp的view鸵闪,誤差小于1dp(2%)檐晕,這點(diǎn)差異完全可以忽略,顯示效果用眼睛看不出差異蚌讼。
所以通過增加通配符各種不同的尺寸辟灰,能讓我們的UI適配更完善。但是篡石,相應(yīng)的也會(huì)增加app的體積芥喇。

小結(jié):
優(yōu)點(diǎn):兼容性好、無性能消耗夏志、
缺點(diǎn):侵入高
ps:因?yàn)榇a遺留問題乃坤,我公司app中的dimens中的計(jì)算錯(cuò)誤苛让,造成現(xiàn)在只能將錯(cuò)就錯(cuò),如果修改dimens湿诊,整個(gè)app的布局參數(shù)都要改...想想就頭皮發(fā)麻

頭條方案

先來看看幾個(gè)公式:

  1. 屏幕寬度(px) = 屏幕(設(shè)計(jì)圖)寬度(dp)* density狱杰;
  2. density = dpi / 160;
  3. dpi =對角線長度(px)/對角線長度(英寸)

假如我們的手機(jī)分辨率為1920*1080厅须、5寸仿畸,則像素密度為2203/5=440dpi
通過上面公式我們能得出:屏幕寬度 1080/(440/160)=392.7dp
實(shí)際寬度392dp,但是我們設(shè)計(jì)圖是360dp朗和,所以實(shí)際顯示效果要比UI要小错沽。
1080px是屏幕的寬度,不可改變眶拉,為了讓寬度是360dp千埃,我們只能統(tǒng)通過修改density是寬度維持在360dp。
到這里你應(yīng)該看出來我們要修改的是density指忆植,沒錯(cuò)頭條的方案就是修改系統(tǒng)的density放可。
代碼很簡單,下面貼出來朝刊。

 public void setCustomDensity(Application application, Activity activity){
        DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
        DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
       
        scaledDensity = appDisplayMetrics.scaledDensity;
        density = appDisplayMetrics.density;
        registerComponentCallbacks(new ComponentCallbacks() {
            @Override
            public void onConfigurationChanged(Configuration newConfig) {
                if (newConfig != null && newConfig.fontScale > 0) {
                    scaledDensity = getResources().getDisplayMetrics().scaledDensity;
                }
            }

            @Override
            public void onLowMemory() {

            }
        });

        float targerDensity = appDisplayMetrics.widthPixels / 360;
        float targerScaleDensity = targerDensity * (scaledDensity / density);
        int targerDpi = (int) (targerDensity * 160);

        appDisplayMetrics.density = targerDensity;
        appDisplayMetrics.scaledDensity = targerScaleDensity;
        appDisplayMetrics.densityDpi = targerDpi;
       
        activityDisplayMetrics.density = targerDensity;
        activityDisplayMetrics.scaledDensity = targerScaleDensity;
        activityDisplayMetrics.densityDpi = targerDpi;
    }

詳情看頭條官方博客

小結(jié):
優(yōu)點(diǎn):沒有性能消耗耀里、侵入低
缺點(diǎn):沒什么明顯的缺點(diǎn)

3、4兩種方案在適配效果上都相當(dāng)不俗拾氓,完全能滿足大部分公司的適配需求冯挎。作為開發(fā)者我們選哪個(gè)呢?嘿嘿咙鞍,怎么選擇看個(gè)人意愿啦房官,兩者沒有優(yōu)劣之分。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奶陈,一起剝皮案震驚了整個(gè)濱河市易阳,隨后出現(xiàn)的幾起案子附较,更是在濱河造成了極大的恐慌吃粒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拒课,死亡現(xiàn)場離奇詭異徐勃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)早像,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門僻肖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卢鹦,你說我怎么就攤上這事臀脏。” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵揉稚,是天一觀的道長秒啦。 經(jīng)常有香客問我,道長搀玖,這世上最難降的妖魔是什么余境? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮灌诅,結(jié)果婚禮上芳来,老公的妹妹穿的比我還像新娘。我一直安慰自己猜拾,他們只是感情好即舌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挎袜,像睡著了一般侥涵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宋雏,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天芜飘,我揣著相機(jī)與錄音,去河邊找鬼磨总。 笑死嗦明,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚪燕。 我是一名探鬼主播娶牌,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼馆纳!你這毒婦竟也來了诗良?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鲁驶,失蹤者是張志新(化名)和其女友劉穎鉴裹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钥弯,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡径荔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脆霎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片总处。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睛蛛,靈堂內(nèi)的尸體忽然破棺而出鹦马,到底是詐尸還是另有隱情胧谈,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布荸频,位于F島的核電站第岖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏试溯。R本人自食惡果不足惜蔑滓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遇绞。 院中可真熱鬧键袱,春花似錦、人聲如沸摹闽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽付鹿。三九已至澜汤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舵匾,已是汗流浹背俊抵。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坐梯,地道東北人徽诲。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像吵血,于是被迫代替她去往敵國和親谎替。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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