Android屏幕適配之dp(最直觀的解讀)

2021-02-07 leaffun

先放結論:



前言:px有什麼問題?

Android屏幕適配由來已久,關鍵在於屏幕尺寸屏幕解析度的變化巨大。在成千上百種機型面前,px單位已難以適應。

1.同樣尺寸,不同解析度:1080px的寬度上顯示100px 比例是100/1080720px的寬度上顯示100px 比例是100/7202.同解析度,不同尺寸:1080px在4.7寸上顯示100px 1080px在6.1寸上顯示100px
如果使用多套px文件方案來適配,市面上少說上百種寸,需要的文件太多了。


第一個問題:同樣尺寸但是不同解析度的屏幕該如何適配?


dp是什麼?

px:像素單位,1px代表1個像素

dpi:像素密度,單位英寸上的像素數量,公式是dpi=屏幕對角線像素總數px/屏幕對角線長度in

density:屏幕密度,規定以160dpi的屏幕其屏幕密度為1,反過來說就是屏幕密度為1的屏幕上1in上有160px

480 dpi/160 = 3320 dpi/160 = 2240 dpi/160 = 1.5160 dpi/160 = 1120 dpi/120 = 0.75

dp:Android開發上的基於屏幕密度的一種密度無關的像素單位,1dp代表的像素長度=density * 1 px

480 dpi上 1dp = 1 * 3 =     3px320 dpi上 1dp = 1 * 2 =     2px240 dpi上 1dp = 1 * 1.5 =   1.5px160 dpi上 1dp = 1 * 1 =     1px120 dpi上 1dp = 1 * 0.75 =  0.75px

dp解決了什麼問題?

以上公式表示了,同樣尺寸上不同解析度(不同density)的設備,每1dp所代表的像素數量是不一樣的。

但是所表示的物理長度(160dp=1in)是一樣的。

160 dp在density=3上表示480px,物理長度為1 in160 dp在density=2上表示320px,物理長度為1 in160 dp在density=1.5上表示240px,物理長度為1 in160 dp在density=1上表示160px,物理長度為1 in160 dp在density=0.75上表示120px,物理長度為1 in

至此,dp單位的使用就意味著你在這些同樣尺寸但是不同解析度的設備上看到的大小一樣,此時各設備上顯示的比例也就一致了。

dp沒有解決什麼問題?

同樣解析度(相同的density)但是尺寸不同的設備上,dp會顯示出什麼樣的效果呢?這裡要算一下每個設備上的總dp,以橫向舉例:

同樣是480 dpi的像素密度,但是尺寸不同的設備:density=3,1080px/(480dpi/160) = 360 dpdensity=3,720px/(480dpi/160) = 240 dp
同樣是320 dpi的像素密度,但是尺寸不同的設備:density=2,1080px/(320dpi/160) = 540 dpdensity=2,720px/(320dpi/160) = 360 dp
同樣是240 dpi的像素密度,但是尺寸不同的設備:density=1.5,1080px/(240dpi/160) = 720 dpdensity=1.5,720px/(240dpi/160) = 480 dp

這種情形下面,有的大屏,有的小屏,各種屏幕的總dp不一樣,dp單位也無法完成適配了。啊哈?那這就跟px的弱點一樣的啊?沒錯就是醬紫~

在dp之上的補充方案


Android3.2之後提供了smallestWidth最小寬度限定符方案:

多套dp文件,文件仍然需要多套,但是比起px會少很多~

不需要與解析度完全匹配,可以找到差距最小的文件,比起px容錯率更高~

並且同時可以使用sp適配文字,比px好~

今日頭條方案

代碼中動態替換density大小~,不需要多套文件了~

所以首選這個方案!!!

Github連結:

https://github.com/JessYanCoding/AndroidAutoSize

理解了這些,再也不用苦惱了哈哈哈

Google對像素密度劃分區域

名稱
像素密度範圍
縮放倍數
ldpi
~120dpi
0.75
mdpi‍120dpi~160dpi1
hdpi160dpi~240dpi1.5
xhdpi240dpi~320dpi2
xxhdpi320dpi~480dpi3
xxxhdpi480dpi~640dpi4

Google官網連結:

https://developer.android.google.cn/guide/practices/compatibility

PS:如果不小心碰到了非標準的方形像素的設備,那麼,呃…嗯看起來就會扁了

相關焦點

  • 詳解px,dp,pt,sp,ppi,dpi及屏幕適配
    本文結構如下:px:像素,構成圖片的最小單位,也是設計的最小單位;像素沒有固定的物理長度,例如iPhone3和iphone4的物理尺寸完全一樣,但是iPhone3的解析度為480*320px,而iphone4的解析度為
  • 一種粗暴快速的Android全屏幕適配方案
    面對市面上五花八門的屏幕大小與解析度,Android基於dp與res目錄名稱來適配的方案已無法滿足一次編寫全屏幕適配的需求,為了達到最優的視覺效果,開發過程中總是需要花費較多資源進行適配。也有開發者給出了一些自己的解決方案。首先來分析一下一些常見的解決方案的現狀:1.官方適配方案
  • android 不同大小的屏幕專題及常見問題 - CSDN
    本文將告訴你如何讓你的應用程式支持各種不同屏幕大小,主要通過以下幾種辦法:讓你的布局能充分的自適應屏幕根據屏幕的配置來加載合適的UI布局確保正確的布局應用在正確的設備屏幕上提供可以根據屏幕大小自動伸縮的圖片使用 "wrap_content" 和 "match_parent" 為了確保你的布局能夠自適應各種不同屏幕大小
  • Android P 劉海屏適配全攻略
    然而作為苦逼的開發者,還是要去適配劉海屏的。好了,吐槽完畢,進入正題。劉海啦啦.jpeg這裡主要是介紹一下Android P中劉海屏的適配以及Android P之前的適配。為什麼要分開呢?因為Android P之前官方還沒提供API來進行適配,都是由各家廠商來提供適配方案的。
  • 行動裝置適配基礎知識速成
    我們都知道現在行動裝置屏幕尺寸非常多,不同的屏幕尺寸又分裂出很多的屏幕解析度,以手機為例iphone和android的屏幕解析度就有:480×800、480×854、540×960、640×960、640×1136、720×1280、750×1334、1080×1920、1242×2208和越來越流行的2K屏。
  • Android面試題-機型適配,例如三星、小米、華為、魅族等
    所有android4.4機型場景:Android4.4系統使用了SystemBarTintManager庫修改透明狀態欄後,會導致根布局從屏幕頂端開始布局,而不是從ActionBar開始布局機型:所有android4.4機型解決方案:方法一:針對4.4創建一套額外的布局,即layout-v19文件夾,並且在根布局外層再套一層LinearLayout,並在LinearLayout
  • Android解析度適配寶典
    3.屏幕密度:表示屏幕每英寸有多少個像素。        dp:Android開發中用於描述尺寸和間距。        sp:和dp一樣,只是用於描述字號和行距。切圖可以直接適配720*1280解析度的機型。        2、720*1280下的切圖資源基本可以適配其他機型,有些特殊的切圖需要單獨適配的,比如icon等。        3、適配480*800的機型,只需要把切圖*0.75即可。        4、適配1080*1920機型,只需要把切圖*1.5即可。
  • Android 10 適配攻略,你適配了嗎?
    適配最簡單粗暴的方法就是在AndroidManifest.xml中添加 android:requestLegacyExternalStorage="true"來請求使用舊的存儲模式。但是我不推薦此方法。
  • 為長屏幕設備做好準備
    大部分利用標準 UI 模塊的 App 都會靈活適配不同的屏幕。官方文檔對這方面也作出了詳細的解釋。但是,開發者可能要花多一點心思去適配很多遊戲或 App 裡的自定義界面。其中一個比較普遍的問題是對於屏幕縱橫比作出錯誤的假設。以下列出幾項比較典型的問題,以作參考。屏幕的上下、左右邊緣可能會被裁剪,導致 UI 整體看起來不完整。
  • Android基礎 - 如何做魯棒性更高的布局
    android:layout_height="match_parent"        android:orientation="horizontal">        <Button            android:layout_width="70dp"            android:layout_height="70dp
  • 那些值得你去細細研究的Drawable適配(上)
    王月半子的博客地址:http://blog.csdn.net/wrg_20100512Android適配的問題太多,有屏幕尺寸的適配、屏幕解析度的適配以及不同系統版本的適配。反映在代碼上,就是需要在資源文件上下功夫,主要是layout和drawable目錄下的文件,這裡主要研究一下drawable的適配。首先我們先熟悉一下基本的概念。
  • android 中常用的五種布局 - CSDN
    線性布局及子類特有的屬性:權重:剩餘屏幕佔有的比例一般情況:在那個方向上設權重,則將該方向的屬性(height或者width)設置為0dp如果在該方向設wrap_content:權重值越大,佔得屏幕比例越多,但小不warp_contant如果設match_parent:權重值越大,佔得屏幕比例越小,但大大不過match_parent
  • 騰訊Bugly乾貨分享:Android機型適配之痛
    本文中詳細介紹了Android琳琅滿目的適配問題。一、個性化十足的Launcher快捷方式雖然看起來只是一個很小的功能點,但是它涉及到的機型適配問題很多。這樣看來問題解決得太輕鬆了,但是遺憾的是刪除快捷方式同樣存在適配問題,數據顯示大約21%的手機無法正常刪除快捷方式。另外一種方法是:自行保存快捷方式的創建記錄,通過一個欄位來記錄快捷方式是否已經創建過了,以此來決定是否創建新的快捷方式。
  • Android 代碼規範文檔
    :layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" /><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android
  • px,ppi;dot,dpi;sp,dp;pt
    ・對於設計師來說像素密度很重要,需要很據像素密度來切圖和適配,理解了像素密度的意義,就理解了幾倍圖之間的關係。3. dot:墨點印刷品的最小單位,表示一個印刷顏色點,類似px,只有相對大小,用在印刷行業。
  • 是時候讓 Android Tools 屬性拯救你了
    Tools attributes 即以 tools  開始的命名空間,舉個我們最常見到的例子:<?xml version="1.0" encoding="utf-8"?header_image_string" tools:ignore="MissingTranslation">header image</string></resources>這個對於 Android studio 升級到 3.0 以上的小夥伴來說應該是很常見了,如果我們項目中涉及到國際化支持,那麼編譯器就會提示我們為每一種語言做適配
  • 移動端適配(一)設備獨立像素1px問題,前端需要知道
    相對長度單位:px、em、rem、vw、vh;px pixel指一張圖片中最小的點。如果點很小,那畫面就清晰,我們稱它為「解析度高」,反之,就是「解析度低」。所以,像素的大小是會「變」的。em是相對長度單位。相對於當前對象內文本的字體尺寸。
  • Android Systrace 基礎知識(5) - SurfaceFlinger 解讀
    和 RenderThread 解讀[11]Systrace 基礎知識 - Binder 和鎖競爭解讀[12]Systrace 基礎知識 - Triple Buffer 解讀[13]Systrace 基礎知識 - CPU Info 解讀[14]正文這裡直接上官方對於 SurfaceFlinger 流程的定義[15]大多數應用在屏幕上一次顯示三個層
  • Android各版本迭代改動與適配集合!
    又要怎麼適配呢?Android4.4HttpURLConnection的底層實現改為了OkHttp。Android5.0ART成為默認虛擬機,完全代替Dalvik虛擬機。Context.bindService() 方法需要顯式 Intent,如果提供隱式 intent,將引發異常。
  • Android ConstraintLayout使用指南
    介紹完上下左右的依賴設置後,下面介紹一些Margin屬性,除了Android常見的各種android:layout_marginXXX外,ConstraintLayout自行添加了如下屬性,還可以配合layout_constraintHorizontal_weight、layout_constraintVertical_weight兩個屬性實現和LinearLayout中設置layout_weight相同的效果,具體的操作這裡就不再展示了,下面一張圖告訴你Chain的靈活強大之處。