官术网_书友最值得收藏!

2.1 屏幕顯示

本節(jié)從最基礎(chǔ)的顯示單元開始介紹,講述了移動(dòng)設(shè)備如何在屏幕上展現(xiàn)豐富多彩的界面。本節(jié)主要內(nèi)容包括像素的幾個(gè)常用單位、顏色的編碼與使用、屏幕分辨率的獲取等。

2.1.1 像素

老子曾說“天下難事必作于易,天下大事必作于細(xì)”,Android開發(fā)也是如此??v使App的界面千變?nèi)f化、絢麗多姿,也都?xì)w因于數(shù)百萬個(gè)像素的組合排列,就像萬物皆由原子構(gòu)成一般。像素看似簡(jiǎn)單,實(shí)際有大學(xué)問,如果對(duì)像素單位不知其所以然,開發(fā)時(shí)只知一根筋的填數(shù)字,結(jié)果在模擬器上運(yùn)行得很好的界面,在真機(jī)上很可能顯示得東倒西歪,這就是沒打好基礎(chǔ)的緣故。如果一開始就把像素的基本概念弄清楚,后面就會(huì)少走很多彎路,開發(fā)起來也會(huì)更加得心應(yīng)手。

Android支持的像素單位有:px(像素)、in(英寸)、mm(毫米)、pt(磅,1/72英寸)、dp(與設(shè)備無關(guān)的顯示單位)、dip(就是dp)、sp(用于設(shè)置字體大?。?。其中,常用的有px、dp和sp三種。

具體來說,px是手機(jī)屏幕上可顯示的最小單位,與物理設(shè)備的顯示屏有關(guān)。一般來說,同樣尺寸的屏幕(比如5寸的手機(jī))看起來越清晰,像素的密度越高,以px計(jì)量的分辨率也越大。

dp與物理設(shè)備無關(guān),只與屏幕的尺寸有關(guān)。一般來說,同樣尺寸的屏幕以dp計(jì)量的分辨率是一樣的,無論這個(gè)手機(jī)是哪個(gè)廠家生產(chǎn)的,dp大小都一樣。

sp的原理跟dp差不多,專門用于設(shè)置字體大小。手機(jī)在系統(tǒng)設(shè)置里可以調(diào)整字體的大小(小、普通、大、超大)。設(shè)置普通字體時(shí),同數(shù)值dp和sp的文字看起來一樣大;如果設(shè)置為大字體,用dp設(shè)置的文字沒有變化,用sp設(shè)置的文字就變大了。例如,當(dāng)系統(tǒng)設(shè)置普通字體時(shí),18dp與18sp的文字一樣大,如圖2-1所示;當(dāng)系統(tǒng)設(shè)置大字體時(shí),18dp的文字大小不變,18sp的文字卻增大了,如圖2-2所示。

圖2-1 普通字體的效果圖

圖2-2 大字體的效果圖

所以說,dp與系統(tǒng)設(shè)置的字體大小沒有關(guān)系,而sp會(huì)隨系統(tǒng)設(shè)置的字體大小變大或變小。

dp和px之間的聯(lián)系取決于具體設(shè)備上的像素密度,像素密度就是DisplayMetrics里的density參數(shù)。當(dāng)density=1.0時(shí),表示一個(gè)dp值對(duì)應(yīng)一個(gè)px值;當(dāng)density=1.5時(shí),表示兩個(gè)dp值對(duì)應(yīng)3個(gè)px值;當(dāng)density=2.0時(shí),表示一個(gè)dp值對(duì)應(yīng)兩個(gè)px值。具體的轉(zhuǎn)換函數(shù)如下:

在XML布局文件中,為了讓不同設(shè)備屏幕擁有統(tǒng)一的顯示效果,除了sp用于設(shè)置文字大小外,其余要用尺寸大小的地方都用dp。在代碼中情況又有所不同,Android用于設(shè)置大小的函數(shù)都以px為單位。無論是LayoutParams里的width和height,還是setMargins和setPadding,參數(shù)單位都是px,要想在代碼中使用dp設(shè)置布局大小或間距,得先把dp值轉(zhuǎn)換成px值。代碼示例如下:

     // 將10dp的尺寸大小轉(zhuǎn)換為對(duì)應(yīng)的px數(shù)值
     int dip_10 = Utils.dip2px(this, 10L);
     // 從布局文件中獲取名叫tv_padding的文本視圖
     TextView tv_padding = findViewById(R.id.tv_padding);
     // 設(shè)置該文本視圖的內(nèi)部文字與控件四周的間隔大小
     tv_padding.setPadding(dip_10, dip_10, dip_10, dip_10);

2.1.2 顏色

在Android中,顏色值由透明度alpha和RGB(紅、綠、藍(lán))三原色定義,有八位十六進(jìn)制數(shù)與六位十六進(jìn)制數(shù)兩種編碼,例如八位編碼FFEEDDCC,F(xiàn)F表示透明度,EE表示紅色的濃度,DD表示綠色的濃度,CC表示藍(lán)色的濃度。透明度為FF表示完全不透明,為00表示完全透明。RGB三色的數(shù)值越大顏色越濃也就越亮,數(shù)值越小顏色越暗。亮到極致就是白色,暗到極致就是黑色,這樣記就不會(huì)搞混了。

六位十六進(jìn)制編碼有兩種情況,在XML文件中默認(rèn)不透明(透明度為FF),在代碼中默認(rèn)透明(透明度為00)。下面的代碼分別給兩個(gè)文本控件設(shè)置六位編碼和八位編碼的背景色。

     // 從布局文件中獲取名叫tv_code_six的文本視圖
     TextView tv_code_six = findViewById(R.id.tv_code_six);
     // 給文本視圖tv_code_six設(shè)置背景為透明的綠色,透明就是看不到
     tv_code_six.setBackgroundColor(0x00ff00);
     // 從布局文件中獲取名叫tv_code_eight的文本視圖
     TextView tv_code_eight = findViewById(R.id.tv_code_eight);
     // 給文本視圖tv_code_eight設(shè)置背景為不透明的綠色,即正常的綠色
     tv_code_eight.setBackgroundColor(0xff00ff00);

從圖2-3可以看到,代碼使用六位編碼看不到任何背景,使用八位編碼能夠看到正確的綠色背景。

圖2-3 不同方式設(shè)置顏色編碼的效果圖

在Android中使用顏色有下列3種方式:

1. 使用系統(tǒng)已定義的顏色常量。

Android系統(tǒng)有12種已經(jīng)定義好的顏色,具體的類型定義在Color類中,詳細(xì)的取值說明見表2-1。

表2-1 顏色類型的取值說明

2. 使用十六進(jìn)制的顏色編碼。

在布局文件中設(shè)置顏色需要在色值前面加“#”,如android:textColor="#000000"。在代碼中設(shè)置顏色可以直接填八位的十六進(jìn)制數(shù)值(如setTextColor(0xff00ff00);),也可以通過Color.rgb(int red, int green, int blue)和Color.argb(int alpha, int red, int green, int blue)這兩種方法指定顏色。在代碼中一般不要用六位編碼,因?yàn)榱痪幋a在代碼中默認(rèn)透明,所以代碼用六位編碼跟不用沒什么區(qū)別。

3. 使用colors.xml中定義的顏色。

res/values目錄下有個(gè)colors.xml文件,是顏色常量的定義文件。如果要在布局文件中使用XML顏色常量,可引用“@color/常量名”;如果要在代碼中使用XML顏色常量,可通過這行代碼獲取:getResources().getColor(R.color.常量名)。

2.1.3 屏幕分辨率

在App編碼中時(shí)常要取手機(jī)的屏幕分辨率(如當(dāng)前屏幕的寬和高),然后動(dòng)態(tài)調(diào)整界面上的布局。在代碼中獲取分辨率就是想辦法獲得DisplayMetrics對(duì)象,然后從該對(duì)象中獲得寬度、高度、像素密度等信息。下面是DisplayMetrics類的常用屬性說明。

  • widthPixels:以px為單位計(jì)量的寬度值。
  • heightPixels:以px為單位計(jì)量的高度值。
  • density:像素密度,即一個(gè)dp單位包含多少個(gè)px單位。

下面是獲取當(dāng)前屏幕的寬度、高度、像素密度的代碼示例。

從一個(gè)接入設(shè)備上獲得屏幕分辨率信息,如圖2-4所示。該設(shè)備為5寸屏幕,分辨率是720*1280,像素密度是2。

圖2-4 某手機(jī)上的分辨率信息

主站蜘蛛池模板: 陆良县| 台东市| 贵溪市| 根河市| 集安市| 太仓市| 镇江市| 彩票| 宾川县| 株洲县| 揭西县| 佛山市| 西平县| 莲花县| 岢岚县| 昂仁县| 江门市| 铜山县| 洱源县| 萍乡市| 通化市| 遵义县| 淳安县| 鹤岗市| 南宁市| 新营市| 封丘县| 汶川县| 聂拉木县| 怀集县| 伽师县| 丹东市| 新余市| 焦作市| 云安县| 祁东县| 南部县| 河东区| 扬州市| 玉林市| 绥江县|