[31→100]Android界面開發(fā)精要1:尺寸

界面依附于具體的運(yùn)行設(shè)備嚷掠,更準(zhǔn)確說是一塊有一塊的屏幕捏检,所以我們首先要弄清屏幕有哪些特性。


Android設(shè)備通用型號(hào)一欄表

這里面有2個(gè)核心概念:

  1. 屏幕的物理尺寸不皆,也即是通常說的屏幕大泄岢恰(Screen Size),用屏幕對(duì)角線長(zhǎng)度來表示霹娄,單位是英寸(")能犯,比如圖中3.7"、4.0"项棠、3.2"等

  2. 屏幕分辨率(Resolution)悲雳,表示屏幕有多精細(xì)挎峦,單位是像素(px)香追,比如圖中480*800、1280*720等坦胶。

  3. 這兩個(gè)值相除透典,產(chǎn)生了一個(gè)新的概念屏幕密度(Screen Density),即單位長(zhǎng)度像素點(diǎn)數(shù)顿苇,單位是 像素/英寸(dpi)峭咒。

以小米4為例,屏幕size = 4.6英寸(2.25英寸*4英寸)纪岁,1080*1920像素凑队。
所以,屏幕密度為 480 = 1080/2.25 = 1920/4幔翰。

由于Android的開放性漩氨,運(yùn)行它的設(shè)備大小和分辨率并不一樣,如果采用px作為基礎(chǔ)的計(jì)算單位遗增,在不同設(shè)備上的視覺效果是不一致的叫惊。比如,同樣一個(gè)300px*100px的矩形做修,在480*800的手機(jī)上很顯眼霍狰,而在1920*1080上可能就只是一點(diǎn)點(diǎn)了。所以我們面臨了界面開發(fā)的經(jīng)典問題——適配

怎么適配——使用DP

為了方便開發(fā)人員適配饰及,Android提出了一個(gè)新的概念獨(dú)立像素單位dp(Density-independent pixel)蔗坯,代替原來的像素單位px。dp與屏幕密度掛鉤燎含。Android規(guī)定:

在一個(gè)屏幕密度為160的設(shè)備上宾濒,1dp=1px。

此后瘫镇,隨著屏幕密度的變化鼎兽,dp保持等比縮放答姥。即

1dp = (當(dāng)前設(shè)備的屏幕密度/160) px
1px = (160/當(dāng)前設(shè)備的屏幕密度)dp

由dp這個(gè)概念,Android規(guī)定了一系列的標(biāo)準(zhǔn)屏幕尺寸:

  • ldpi:屏幕密度為120谚咬。
  • mdpi:屏幕密度為160鹦付。
  • hdpi:屏幕密度為240。
  • xhdpi:屏幕密度為320择卦。
  • xxhdpi:屏幕密度為480敲长。
  • xxxhdpi:屏幕密度為640。
  • tvdpi:屏幕密度為213秉继。

除了這些標(biāo)準(zhǔn)尺寸外祈噪,也可自定義其它屏幕密度,包括Google Nexus系列都采用了一些非標(biāo)準(zhǔn)尺寸尚辑,比如420dpi辑鲤、560dpi。


Android常用設(shè)備dpi列表

在Android代碼DisplayMetrics類中杠茬,也為這些常用dpi做了定義:

public static final int DENSITY_280 = 280;
public static final int DENSITY_360 = 360;
public static final int DENSITY_400 = 400;
public static final int DENSITY_420 = 420;
public static final int DENSITY_560 = 560;
public static final int DENSITY_DEFAULT = 160;
public static final int DENSITY_HIGH = 240;
public static final int DENSITY_LOW = 120;
public static final int DENSITY_MEDIUM = 160;
public static final int DENSITY_TV = 213;
public static final int DENSITY_XHIGH = 320;
public static final int DENSITY_XXHIGH = 480;
public static final int DENSITY_XXXHIGH = 640;

DP是一個(gè)好的解決方案嗎月褥?

在實(shí)際開發(fā),設(shè)計(jì)人員提供的視覺設(shè)計(jì)圖瓢喉,視覺工具從圖上直接取到的像素px宁赤,直接采用dp機(jī)制,意味著開發(fā)人員需要不斷地將px轉(zhuǎn)成dp栓票,這工作量大决左、繁瑣、重復(fù)走贪。所以對(duì)于開發(fā)人員而言佛猛,更好的機(jī)制是利用dimension機(jī)制,將dp映射為設(shè)計(jì)圖的px值厉斟。如下:

    <!-- 寬度 -->
    <dimen name="width_720_1280_1">0.50dp</dimen>
    <dimen name="width_720_1280_2">1.00dp</dimen>
    <dimen name="width_720_1280_3">1.50dp</dimen>
    <dimen name="width_720_1280_4">2.00dp</dimen>
    ……
    <dimen name="width_720_1280_716">358.00dp</dimen>
    <dimen name="width_720_1280_717">358.50dp</dimen>
    <dimen name="width_720_1280_718">359.00dp</dimen>
    <dimen name="width_720_1280_719">359.50dp</dimen>
    <dimen name="width_720_1280_720">360.00dp</dimen>
    <!-- 高度 -->
    <dimen name="height_720_1280_1">0.50dp</dimen>
    <dimen name="height_720_1280_2">1.00dp</dimen>
    <dimen name="height_720_1280_3">1.50dp</dimen>
    <dimen name="height_720_1280_4">2.00dp</dimen>
    ……
    <dimen name="height_720_1280_1277">638.50dp</dimen>
    <dimen name="height_720_1280_1278">639.00dp</dimen>
    <dimen name="height_720_1280_1279">639.50dp</dimen>
    <dimen name="height_720_1280_1280">640.00dp</dimen>
    <!-- 文字 -->
    <dimen name="text_size_720_1280_1">0.50sp</dimen>
    <dimen name="text_size_720_1280_2">1.00sp</dimen>
    <dimen name="text_size_720_1280_3">1.50sp</dimen>
    <dimen name="text_size_720_1280_4">2.00sp</dimen>
    ……
    <dimen name="text_size_720_1280_87">43.50sp</dimen>
    <dimen name="text_size_720_1280_88">44.00sp</dimen>
    <dimen name="text_size_720_1280_89">44.50sp</dimen>
    <dimen name="text_size_720_1280_90">45.00sp</dimen>

這樣挚躯,對(duì)界面繪制人員而言,只需要將圖片上的px直接寫在就可以了擦秽,節(jié)省了很多重復(fù)計(jì)算的時(shí)間码荔。

怎么制作這樣px映射表呢?

  1. 確定UI設(shè)計(jì)基于什么樣的分辨率感挥?比如640*1136(這是iPhone5的分辨率);
  2. 確定目標(biāo)適配的Android尺寸缩搅?比如720*1289;
  3. 確定dimens的dpi,常用dpi如下:

ldpi:屏幕密度為120触幼。
mdpi:屏幕密度為160硼瓣。
hdpi:屏幕密度為240。
xhdpi:屏幕密度為320。
xxhdpi:屏幕密度為480堂鲤。
xxxhdpi:屏幕密度為640亿傅。
tvdpi:屏幕密度為213。

  1. 執(zhí)行Python代碼:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import csv
import os
import re
import sys
import zipfile
import xml.etree.ElementTree as ElementTree

'''自動(dòng)生成相應(yīng)的dimens.xml文件'''
if __name__ == '__main__':
    # print "srcipt:", sys.argv[0]
    # for i in range(1, len(sys.argv)):
    #     print "argv[", i , "] = ", sys.argv[i]

    # 原型界面提供的尺寸
    uiWidth = 640;
    uiHeight = 1136;

    # 目標(biāo)設(shè)備尺寸瘟栖,即目標(biāo)機(jī)型界面
    desWidth = 720
    desHeight = 1280

    # 目標(biāo)屏幕密度
        # ldpi:屏幕密度為120葵擎。
        # mdpi:屏幕密度為160。
        # hdpi:屏幕密度為240半哟。
        # xhdpi:屏幕密度為320酬滤。
        # xxhdpi:屏幕密度為480。
        # xxxhdpi:屏幕密度為640寓涨。
        # tvdpi:屏幕密度為213盯串。
    density = 320

    print "<!-- "
    print "\t\tUI提供寬高: %d*%d" % (uiWidth, uiHeight)
    print "\t\t適配屏幕寬高: %d*%d" % (desWidth, desHeight)
    print "\t\t適配屏幕密度: %ddpi" % (density)
    print "--> "

    ratio = 1.0*desWidth/uiWidth
    # 輸出合理的dimens.xml文件
    for i in range(uiWidth):
        j = i + 1
        # print "<dimen name=\"ws_%d_%d_%s\">%.2fdp</dimen>" % (desWidth, desHeight, j, 1.0 * j * density)
        print "<dimen name=\"ws%s\">%.2fdp</dimen>" % (j, 1.0 * j * ratio * 160/density)

    for i in range(uiHeight):
        j = i + 1
        # print "<dimen name=\"hs_%d_%d_%s\">%.2fdp</dimen>" % (desWidth, desHeight, j, 1.0 * j * density)
        print "<dimen name=\"hs%s\">%.2fdp</dimen>" % (j, 1.0 * j * ratio * 160/density)

    for i in range(90):
        j = i + 1
        # print "<dimen name=\"ts_%d_%d_%s\">%.2fsp</dimen>" % (desWidth, desHeight, j, 1.0 * j * density)
        print "<dimen name=\"ts%s\">%.2fsp</dimen>" % (j, 1.0 * j * ratio * 160/density)

Panda
2016-05-26

最后編輯于
?著作權(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)容