- Android Studio開發(fā)實(shí)戰(zhàn):從零基礎(chǔ)到App上線(第2版)
- 歐陽燊
- 2007字
- 2019-12-06 12:07:15
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ī)上的分辨率信息
- TD-SCDMA移動(dòng)通信技術(shù)
- 電子線路
- 智能光網(wǎng)絡(luò)技術(shù)及應(yīng)用
- 先進(jìn)PID控制MATLAB仿真(第5版)
- 移動(dòng)通信系統(tǒng)演進(jìn)及3G信令
- 物聯(lián)網(wǎng)-射頻識(shí)別(RFID)核心技術(shù)教程
- WCDMA網(wǎng)絡(luò)測(cè)試與優(yōu)化教程
- 通信那些事兒(上冊(cè))
- 一本書讀懂5G
- PTN分組傳送設(shè)備組網(wǎng)與實(shí)訓(xùn)(第2版)
- RxJava反應(yīng)式編程
- 信息通信系統(tǒng)接入網(wǎng)維護(hù)管理概要
- 第三代移動(dòng)通信技術(shù)(第2版)
- CMOS模擬集成電路全流程設(shè)計(jì)
- HCNA-WLAN學(xué)習(xí)指南