Android屏幕適配小結(jié)

Android屏幕的適配,是每一個Android工程師在開發(fā)過程中都會遇到的惱人的難題,其實我們看一下android設(shè)備就知道了,千奇百怪,萬種變化,在適配的時候就有點(diǎn)怵.

屏幕適配的原因:

由于Android系統(tǒng)的開放性缴允,任何用戶轧膘、開發(fā)者虎敦、OEM廠商冷冗、運(yùn)營商都可以對Android進(jìn)行定制,修改成他們想要的樣子闰围。而隨著支持Android系統(tǒng)的設(shè)備(手機(jī)留搔、平板译红、電視、手表)的增多铃将,設(shè)備碎片化项鬼、品牌碎片化、系統(tǒng)碎片化劲阎、傳感器碎片化和屏幕碎片化的程度也在不斷地加深

重要概念:

1. 屏幕尺寸绘盟、屏幕分辨率、屏幕像素密度

屏幕尺寸:屏幕對角線長度,單位是英寸龄毡,我們常說的多少多少寸吠卷,比如4.7存手機(jī)、5.7存手機(jī)沦零,指的就是這個祭隔。

屏幕分辨率:如 1920×1080,是指在手機(jī)屏幕的像素點(diǎn)的個數(shù)路操,單位是px疾渴,1px = 1 像素點(diǎn),一般是縱向像素× 橫向像素寻拂,意味著高有1920 個像素點(diǎn)程奠,寬有1080 個像素點(diǎn)。表示物理屏幕區(qū)域內(nèi)像素點(diǎn)的總和(切記:跟屏幕適配沒有任何關(guān)系),因為我們既可以把1920*1080的分辨率做到4.0的手機(jī)上,也可以把這個分辨率做到5.0英寸的手機(jī)上面,如果分辨率相同,手機(jī)屏幕越小越清晰

屏幕像素密度:是指每英寸上的像素點(diǎn)數(shù)祭钉,單位是dpi(dotper inch)瞄沙。像素密度和屏幕尺寸和屏幕分辨率有關(guān),它是由對角線的像素點(diǎn)數(shù)除以屏幕的大小得到的慌核,關(guān)系如下:

圖片.png

屏幕像素密度算法
(單一變化條件下距境,屏幕尺寸越小、分辨率越高垮卓,像素密度越大垫桂,反之越小。)

dp粟按、dip诬滩、dpi、sp灭将、px(pix)
dp:是Android 特有的疼鸟,意為密度無關(guān)像素,Google 發(fā)布的BASELINE(基準(zhǔn)線)為160庙曙,以此為基準(zhǔn)空镜。
dip:Density Independent Pixels,同dp一個意思捌朴,目前廢棄了吴攒,一般都寫dp。
dpi:即為屏幕像素密度的單位
sp:Scale-IndependentPixels的縮寫砂蔽,可以根據(jù)文字大小首選項自動進(jìn)行縮放洼怔。Google推薦我們使用12sp以上的大小,通匙蠹荩可以使用12sp镣隶,14sp泽台,18sp,22sp矾缓,為避免精度損失怀酷,建議最好不要使用奇數(shù)和小數(shù)。
px(pix):就是我們常說的像素,就是屏幕中最小的一個顯示單元.不同設(shè)備顯示的效果相同

mdpi嗜闻、hdpi蜕依、xhdpi、xxhdpi琉雳、xxxhdpi

圖片.png

一般都是采用以下幾種解決方案:
解決方案看圖:

圖片.png
圖片.png

適配相關(guān)術(shù)語:
分辨率(eg):480X800,1280X720样眠。表示物理屏幕區(qū)域內(nèi)像素點(diǎn)的總和。(切記:跟屏幕適配沒有任何關(guān)系) 因為我們既可以把1280X720的分辨率做到4.0的手機(jī)上面翠肘。我也可以把1280X720的分辨率做到5.0英寸的手機(jī)上面檐束,如果分辨率相同,手機(jī)屏幕越小越清晰束倍。

px(pix):像素被丧,就是屏幕中最小的一個顯示單元。不同設(shè)備顯示效果相同绪妹。

dpi(像素密度):即每英寸屏幕所擁有的像素數(shù)甥桂,像素密度越大,顯示畫面細(xì)節(jié)就越豐富邮旷。計算公式:像素密度=√{(長度像素數(shù)2+寬度像素數(shù)2)}/ 屏幕尺寸
(注:屏幕尺寸單位為英寸 例:分辨率為1280*720 屏幕寬度為6英寸 計算所得像素密度約等于245黄选,屏幕尺寸指屏幕對角線的長度.)

dip: deviceindependent pixels ,設(shè)備獨(dú)立像素婶肩。不同設(shè)備有不同的顯示效果,這個和設(shè)備硬件有關(guān)办陷。

屏幕適配方式:

  • 圖片適配
    在我們的Android工程目錄中有如下drawable/mipmap-*dpi目錄,這些目錄是用來適配不同分辨率手機(jī)的律歼。
圖片.png

不同的目錄民镜,代表手機(jī)不同的像素密度:

圖片.png

以下是Android系統(tǒng)的適配策略:
Android應(yīng)用在查找圖片資源時會根據(jù)其分辨率自動從不同的文件目錄下查找。如果在低分辨的文件目錄中比如drawable-mdpi中沒有圖片資源苗膝,其他目錄中都有殃恒,當(dāng)我們將該應(yīng)用部署到mdpi分辨率的手機(jī)上時植旧,那么該應(yīng)用會查找分辨率較高目錄下的資源文件辱揭,如果較高分辨率目錄下也沒有資源則只好找較低目錄中的資源了。

1.尺寸適配
跟drawable目錄類似的病附,在Android工程的res目錄下有values目錄问窃,這個是默認(rèn)的目錄,同時為了適配不同尺寸手機(jī)我們可以創(chuàng)建一個values-1280x720的文件夾完沪,同時將dimens.xml文件拷貝到該目錄下域庇。

圖片.png

在dimens.xml中定義一個尺寸嵌戈,如下圖所示。

圖片.png

在values-1280x720目錄中的dimens.xml中定義同樣的尺寸名稱听皿,但是使用不同的尺寸熟呛,如下圖所示。

圖片.png

當(dāng)我們在布局文件中使用長或者寬度單位時尉姨,比如下圖所示庵朝,應(yīng)該使用@dimen/width來靈活的定義寬度。

圖片.png
  • 布局適配-(這種適配幾乎不常見)

跟values一樣又厉,在Android工程目錄中l(wèi)ayout目錄也支持類似values目錄一樣的適配九府,在layout中我們可以針對不同手機(jī)的分辨率制定不同的布局,如下圖所示覆致。

圖片.png
  • 權(quán)重適配(谷歌推薦)
    在控件中使用屬性android:layout_weight="1"可以起到適配效果侄旬,但是該屬性的使用有如下規(guī)則: 只能用在線性控件中,比如LinearLayout煌妈。 豎直方向上使用權(quán)重的控件高度必須為0dp(Google官方的推薦用法) 水平方向上使用權(quán)重的控件寬度必須為0dp(Google官方的推薦用法)

  • 代碼適配
    在java代碼中動態(tài)計算控件的寬度和高度儡羔。 注意:計算的寬度和高度,這里涉及到dp和px之間的轉(zhuǎn)化:
    說明一下dp代表什么意思璧诵? dip: deviceindependent pixels(設(shè)備獨(dú)立像素)笔链。不同設(shè)備有不同的顯示效果,這個和設(shè)備硬件有關(guān)。這里指一個抽象意義上的像素腮猖,程序用它來定義界面元素鉴扫。一個與密度無關(guān),在邏輯尺寸上澈缺,與一個位于像素密度為160dpi的屏幕上的像素是一致的坪创。
    要把密度無關(guān)像素轉(zhuǎn)換為屏幕像素可以用這樣一個簡單的公式:pixels=dips*(density/160)。
    舉個例子姐赡,在DPI為240的屏幕上莱预,1個DIP等于1.5個物理像素。
    代碼中相互換算:

圖片.png
  • 百分比適配
    該適配一般對圖片進(jìn)行適配的项滑。 比如:在同一張圖片依沮,在不同的設(shè)備中,按照圖片的寬高比例枪狂,進(jìn)行縮放顯示危喉。
  1. 獲取圖片的寬度和高度
  2. 計算圖片的寬度和高度的比例
  3. 根據(jù)圖片的比例,計算出圖片的在設(shè)備中的顯示的實際寬度和高度

關(guān)于切圖數(shù)量的分析:

跟UI人員要求,對于主流的手機(jī)機(jī)型分辨率,選1至2套完整的一套圖片(比如1920×1080分辨率是主流機(jī)型),這一套圖必須是完整的,但是對于平鋪整個界面的大圖需要多切幾套,比如說歡迎界面,幫助界面等之類的圖片,針對于小圖的話就只需要一套左右就夠了,因為小圖在屏幕上的稍微拉伸,人的視覺效果是很難感覺到的,在android studio圖片目錄結(jié)構(gòu)中,編譯工具找圖的順序是當(dāng)找不到的時候,先往高分辨率,再往低分辨率找.

為什么我們要將對應(yīng)分辨率的圖片放入對應(yīng)文件夾?(根據(jù)以下圖片進(jìn)行分析)

圖片.png

三星手機(jī)拍照有哪些bug?

  • 攝像頭拍照后圖片數(shù)據(jù)有可能不能返回; 應(yīng)該是onActivityResult 的data為空

  • 三星手機(jī)的相機(jī)camera強(qiáng)制切換到橫屏,導(dǎo)致Activity重啟生命周期(部分機(jī)型即使配置android:configChanges也不能阻止橫豎屏切換)

  • APP Activity A調(diào)用了系統(tǒng)拍照-->拍照-->在拍好照片的界面做幾次橫豎屏的轉(zhuǎn)換后-->返回APP界面時,Activity A卻被銷毀了

平時開發(fā)過程中,如何做到多分辨適配的?

  • 首先明確開發(fā)設(shè)備分辨率:一般選擇1920*1080的分辨率(市面上主流的手機(jī)分辨率)
  • 根據(jù)分辨率的不同建立不同分辨率的資源圖片(可以根據(jù)切圖的數(shù)量進(jìn)行分析)
  • 在程序啟動的時候,獲取當(dāng)前屏幕的分辨率和密度,在代碼中進(jìn)行適配
  • 根據(jù)目標(biāo)設(shè)備,為不同分辨率的寫不同的dimen文件
  • 盡量使用權(quán)重分配(Google推薦)
  • 根據(jù)需求可以使用代碼適配以及百分比適配
  • 針對特殊的設(shè)備,進(jìn)行特殊的適配
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末州疾,一起剝皮案震驚了整個濱河市辜限,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌严蓖,老刑警劉巖薄嫡,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氧急,死亡現(xiàn)場離奇詭異,居然都是意外死亡毫深,警方通過查閱死者的電腦和手機(jī)吩坝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哑蔫,“玉大人钾恢,你說我怎么就攤上這事≡е罚” “怎么了瘩蚪?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稿黍。 經(jīng)常有香客問我疹瘦,道長,這世上最難降的妖魔是什么巡球? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任言沐,我火速辦了婚禮,結(jié)果婚禮上酣栈,老公的妹妹穿的比我還像新娘险胰。我一直安慰自己,他們只是感情好矿筝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布起便。 她就那樣靜靜地躺著,像睡著了一般窖维。 火紅的嫁衣襯著肌膚如雪榆综。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天铸史,我揣著相機(jī)與錄音鼻疮,去河邊找鬼。 笑死琳轿,一個胖子當(dāng)著我的面吹牛判沟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崭篡,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼挪哄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了媚送?” 一聲冷哼從身側(cè)響起中燥,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寇甸,失蹤者是張志新(化名)和其女友劉穎塘偎,沒想到半個月后疗涉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吟秩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年咱扣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涵防。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡闹伪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壮池,到底是詐尸還是另有隱情偏瓤,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布椰憋,位于F島的核電站厅克,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏橙依。R本人自食惡果不足惜证舟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窗骑。 院中可真熱鬧女责,春花似錦、人聲如沸创译。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽软族。三九已至辛藻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間互订,已是汗流浹背吱肌。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仰禽,地道東北人氮墨。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像吐葵,于是被迫代替她去往敵國和親规揪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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