Android屏幕適配

Android屏幕適配一直是Android開發們的一個痛點,各種各樣的屏幕分辨率等,對Android的屏幕適配帶來了很大的麻煩,而谷歌的解決方案也并不被所有人滿意,所以筆者結合Android官方文檔,來談談這個話題。

術語和基本概念

本節介紹Android屏幕單位等的一些基本概念。

屏幕尺寸

官方文檔的解釋是:

按屏幕對角測量的實際物理尺寸。 為簡便起見,Android 將所有實際屏幕尺寸分組為四種通用尺寸:小、 正常、大和超大。

屏幕尺寸是指屏幕的物理尺寸大小,Android使用samll,normal,large,xlarge作為屏幕尺寸的限定符(3.2之后推薦使用sw<N>dp等來適配屏幕大小)。

屏幕密度

屏幕物理區域中的像素量,屏幕密度的單位是dpi(每英寸點數),粗略來說,屏幕密度越高的手機,看起來越清晰,我們通常放多組圖片就是根據屏幕密度來劃分的,Android將屏幕密度分為低、中、高、超高、超超高和超超超高,用字母表示是ldpi,mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi。

分辨率

分辨率是指屏幕寬高的像素值。

密度無關像素

官方文檔的解釋是:

在定義 UI 布局時應使用的虛擬像素單位,用于以密度無關方式表示布局維度 或位置。

密度無關像素等于 160 dpi 屏幕上的一個物理像素,這是 系統為“中”密度屏幕假設的基線密度。在運行時,系統 根據使用中屏幕的實際密度按需要以透明方式處理 dp 單位的任何縮放 。dp 單位轉換為屏幕像素很簡單: px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定義應用的 UI 時應始終使用 dp 單位 ,以確保在不同密度的屏幕上正常顯示 UI。

典型手機的屏幕

先看dp和px的信息:

dpi?px=1dp
ldpi120dpi0.75
mdpi160dpi1
hdpi2400dpi1.5
xhdpi320dpi2
xxhdpi480dpi3
xxxhdpi640dpi4

也就是說,屏幕像素密度越高的手機,1dp轉換的像素數越大,成正比。 知道了dp的px轉換,那么,Google引入dp來代替px究竟有什么用處呢?dp究竟是什么值呢? 看這個問題就要先看dpi,dpi是每英寸像素數,而dp與px的轉換是與dpi成正比的,那么,對于一個dpi是x的手機來說,每英寸對應xpx,而對于這個手機來說,(x/160)px=1dp,那么每英寸對應x(160/x)dp=160dp。所以dp實際上反應的是實際的物理尺寸,和屏幕的分辨率,屏幕的像素密度等都無關。

Google推薦適配方案

了解了這些基本概念后,那么我們試著去理解Google的屏幕適配理念。首先,對用戶來說,相同物理大小的屏幕肯定是一樣的布局更好,而不該受限于屏幕的像素密度,所以Google用dp來解決這個問題,使用dp作為長度的單位,并配合Android的提供資源方案,能做到在相同物理大小的屏幕上有相同的布局。那么對于不同物理大小的屏幕,Google推薦對不同的屏幕進行專門的適配,而不是對布局進行簡單的拉伸。

按比例適配方案

Google的方案固然是好,可是我們在做快速開發的時候,并不可能在屏幕的適配上下這么大的功夫,那有沒有辦法讓所有屏幕的布局按比例看起來都是一樣的呢。。。鴻洋的文章Android 屏幕適配方案給出了一個這樣的方案。大致就是,根據UI給的切圖,通過Java代碼生成values文件,把所有的像素值替換成其余屏幕上的像素值。 例如UI切圖是480320的分辨率,那么: 寬度為320,將任何分辨率的寬度分為320份,取值為x1-x320; 高度為480,將任何分辨率的高度分為480份,取值為y1-y480。 對于800480的寬度480:

其余分辨率類似。那么現在如果我們對所有的分辨率都做這個處理:
然后布局的時候使用xn,yn做單位,就可以做到按照百分比去適配屏幕了。

這么做是不是就完全沒問題呢?

  1. 我們做頭像的ImageView一般是正方形的,在上例中,UI給的切圖可能是40*40像素的,我們就在布局中寫x40*y40,可是其不不能保證在所有屏幕中都是正方形的。例如對于800*480的屏幕,x40=66.7px,y40=60px,這時候顯示在屏幕上的就不是正方形的了。
  2. 使用px去適配是偏離Google的適配方案的,那么對于小屏幕高dpi的手機,Android會選擇高精度圖片,而由于屏幕小導致分辨率也不高,實際顯示的像素可能低于選用的圖片,造成內存的浪費(此時常規方式寫的界面一般也會有適配問題)。也就是說Android的資源選取方案“不好用”了。

適配建議

以下是Google給的屏幕適配建議:

  1. 在 XML 布局文件中指定尺寸時使用 wrap_content、match_parent 或 dp 單位;
  2. 不要在應用代碼中使用硬編碼的像素值;
  3. 不要使用 AbsoluteLayout(已棄用);
  4. 為不同屏幕密度提供替代位圖可繪制對象;

對于UI的切圖,我們將其像素轉換為dp寫界面時,在xml文件中盡量不要使用較大的dp值,例如

我們寫紅色快的位置時,最好不要使用android:layout_marginRight="200dp",使用android:layout_alignParentRight="true" android:layout_marginRight="30dp"替代,因為200dp占屏幕的百分比更大,在不同屏幕下差異會比較大,對于寬400dp的屏幕,她左邊對其50%的位置,對于寬600dp的屏幕,她左邊對其67%的位置。當必須要使用大數值的dp時,如輪播圖的高度等,可以對數值坐下屏幕適配。

寫在最后的話

屏幕適配是個很繁雜的問題,可是一般也不用太受它困擾,我們只要使用dp去編寫界面,就能滿足大部分的適配要求,然后在針對測試出來的適配問題去專門適配就好。

參考

Android 屏幕適配方案 Android開發:最全面、最易懂的Android屏幕適配解決方案 官方文檔

轉載于:https://juejin.im/post/5aa7351e6fb9a028d3751116

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452335.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452335.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452335.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

萬維網www

WWW是環球信息網的縮寫&#xff0c;&#xff08;亦作“Web”、“WWW”、“W3”&#xff0c;英文全稱為“World Wide Web”&#xff09;&#xff0c;中文名字為“萬維網”&#xff0c;"環球網"等&#xff0c;常簡稱為Web。 分為Web客戶端和Web服務器程序。 WWW可以讓W…

飛控計算機的作用,用于波音777飛機的主要飛控計算機

用于波音777飛機的主要飛控計算機飛行控制計算機容錯技術本文介紹了在ERA1992年航空電子會議上介紹的波音777的主要飛控計算機。介紹了系(本文共1頁)閱讀全文>>在對無人機飛控計算機技術發展應用敘述的基礎上,設計了一款基于Zynq平臺的應用于小型無人機的飛控計算機硬件平…

Springboot,SSM框架的區別

參考文獻&#xff1a;文章一 參考文獻&#xff1a;文章二 總結&#xff1a; 1.Springboot 將原有的 xml 配置&#xff0c;簡化為 java 注解 2.使用 IDE 可以很方便的搭建一個 springboot 項目&#xff0c;選擇對應的 maven 依賴&#xff0c;簡化Spring應用的初始搭建以及開發過…

Mysql導入excel數據,解決某些特殊字符亂碼問題

問題 做項目需要從excel表格導入到mysql的數據庫表中&#xff0c;excel表格中的“規格”字段的“”符號導入數據庫表中&#xff0c;會出現部分數據的“”這個符號會亂碼&#xff0c;成“&#xff1f;”的形式。 解決方法 打開excel表格&#xff0c;另存為csv文件&#xff1b;用…

Redis進階實踐之十六 Redis大批量增加數據

原文:Redis進階實踐之十六 Redis大批量增加數據一、介紹 有時候&#xff0c;Redis實例需要在很短的時間內加載大量先前存在或用戶生成的數據&#xff0c;以便盡可能快地創建數百萬個鍵。這就是所謂的批量插入&#xff0c;本文檔的目標是提供有關如何以盡可能快的速度向…

項目經理溝通的四個好習慣

一名項目經理溝通的時間占到工作時間的80%&#xff0c;所以如何提高溝通效率就變成了項目經理提高工作效率的重點。 一名優秀的項目經理&#xff0c;無疑是一個好的溝通者。因為&#xff0c;專業的技能可以使你成為某個領域的專家&#xff0c;但出色的溝通技能&#xff0c…

u盤安裝成功計算機里找不到文件夾,u盤里的文件不見了,詳細教您U盤內容不顯示怎么辦...

在工作、學習中&#xff0c;我們需要把資料攜帶外出的時候&#xff0c;首選的存儲工具基本上都是U盤。不過有用戶在使用U盤時卻遇到了U盤的所有的文件夾不見了的情況&#xff0c;但內存的明明文件還在&#xff0c;這到底是為什么呢&#xff1f;難道U盤的文件真的不見了嗎&#…

五分鐘實現SpringBoot快速入門

文章目錄一、創建Maven工程二、添加SpringBoot的起步依賴三、編寫SpringBoot引導類四、編寫Controller五、測試六、SpringBoot工程熱部署一、創建Maven工程 二、添加SpringBoot的起步依賴 文件位置&#xff1a;pom.xml SpringBoot要求&#xff0c;項目要繼承SpringBoot的起步…

分布式系統開發工具包 —— 基于Kryo的Java對象序列化

Kryo是用于Java語言的一個快速和高效的對象圖序列化框架。Kryo項目的目的是快速、高效、方便地使用API。當需要持久化對象的時候&#xff0c;不論是持久化到文件、數據庫還是網絡&#xff0c;都可以使用Kryo。 目前Kryo已經到了4.0.1版本以上了。本文的介紹適用于V2.0以上版本。…

代碼編輯器Sublime Text 可以跨平臺(linux,window,os x)

說到代碼編輯器&#xff0c;大部分人首先會想到UltraEdit&#xff0c;EmEditor和notepad。但今天要介紹的是另一款功能非常強大的代碼編輯器——Sublime Text。Sublime Text還是一款跨 OS X、Linux 和 Windows 三大平臺的文字/代碼編輯器。除了Sublime Text出色的功能&#xff…

計算機畫圖怎樣更改文字,如何在圖片上改字|超簡單的修改圖片里文字方法

這篇文章將要給大家介紹的是&#xff0c;不用聯網&#xff0c;不用下載專業的圖像處理軟件&#xff0c;單純用畫圖工具&#xff0c;就能修改表情包、圖片上文字的方法&#xff0c;只適合簡單的圖片處理&#xff0c;復雜的還是交給專業的圖像處理工具吧。下面系統吧就給大家帶來…

軟件維護

所謂軟件維護就是在軟件已經交付使用之后&#xff0c;為了改正錯誤或滿足新的需要而修改軟件的過程。可以通過描述軟件交付使用后可能進行的4項活動&#xff0c;具體地定義軟件維護。 1.改正性維護 因為軟件測試不可能暴露出一個大型軟件系統中所有潛藏的錯誤&#xff0c;所以…

【intellij idea】Project Structure 講解

參考文章&#xff1a;戳這里 謝謝樓主分享

將以太坊封裝為 ERC20

將以太坊封裝為 ERC20 TOKEN 很多 DAPP 都是在處理 ERC20接口的 token, 其實很容易將以太坊封裝為 ERC20,這樣就可以統一處理, 至少我目前在做的雷電網絡就是這么處理的. 主要內容復制在網絡https://programtheblockchain.com/posts/2018/05/26/wrapping-ether-in-an-erc20-tok…

javascript高級程序設計學習之數值轉換 |Number(),parseInt(),parseFloat()

2019獨角獸企業重金招聘Python工程師標準>>> 將非數值轉換成數值的函數有三個&#xff1a;Number(),parseInt(),parseFloat(); 小記tip&#xff1a;Number()可以用于任何數據類型&#xff1b;parseInt(),parseFloat()針對的是將字符串&#xff1b; Number()的轉換規…

軟件的可維護性

可以把軟件的可維護性定性地定義為&#xff1a;維護人員理解、改正、改動或改進這個軟件的難易程度。 提高可維護性是支配軟件工程方法學所有步驟的關鍵目標。

服務器內存延遲,內存帶寬、延遲性能測試

內存帶寬、延遲性能測試華為FusionServer 2488H V5服務器主板集成了48個內存插槽&#xff0c;但送測機器配備有限。由于送測機型整合了四通道內存控制器&#xff0c;這樣使得平臺的內存帶寬得到了明顯的提升。SiSoftware Sandra Lite 2011中提供了內存帶寬、內存延遲和緩存性能…

Git學習的最佳教程

身為網頁設計師或者網頁開發者的你&#xff0c;可能已經聽說過Git這個正快速成長的版本控制系統。它由GitHub維護&#xff1b;GitHub是一個開放性的、存儲眾人代碼的網站。如果你想學習如何使用Git&#xff0c;請參考本文。在文章最后&#xff0c;我們羅列了其他Git學習資源。 …

如何使用idea快速創建SpringBoot項目

文章目錄一、二、三、四、五、一、 二、 三、 四、 五、