Andriod界面設計適配和Android Studio中的資源
Andriod界面設計適配只與屏幕大小和屏幕密度相關。本文對與界面適配相關的術語,諸如DPI、DP、SP等做了仔細分析,并學習了Android Studio中相關的資源路徑以及通過R的哪一個子類來訪問。Android的碎片化已經被噴了好多年,隨著國內手機廠商的崛起,碎片化也越來越嚴重,根據OpenSignal的最新調查,2014年市面上有18796種不同的Android設備,作為開發者,一個無法回避的難題就是需要適配各種各樣奇奇怪怪的機型。 設備機型不同必然也會導致屏幕大小和分辨率(Resolution)的不同,但是無論分辨率有多大,屏幕有多大,我們手指觸控范圍的大小不會發生變化,所以最優的適配方式應該是指定大小的控件在所有的設備上的顯示都一樣。
Android的官方文檔對此也有明確的說明
When adding support for multiple screens, applications do not work directly with resolution; applications should be concerned only with screen size and density, as specified by the generalized size and density groups.
</blockquote>所以,適配應該與分辨率無關,只與屏幕大小和屏幕密度相關,以下是與單位相關的術語:
(1) Screen size 屏幕的尺寸,即對角線長度(單位inch-英寸)
(2) Resolution 分辨率,即屏幕的總像素點數(width * height)
(3) Screen Density屏幕密度,即每單位英寸包含的像素點數(dots/inches)
(4)Density- independent pixel (dp或dip) 密度無關像素,或者說是與屏幕密度無關的像素。標準是160dip,即1dp對應1個pixel,計算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp對應的像素點越多。
第一、屏幕尺寸
一般表示是手機的實際物理尺寸,屏幕尺寸指屏幕的對角線的長度,單位是英寸,1英寸=2.54厘米。比如常見的屏幕尺寸有3.5、3.7、4.2、5.0、5.5、6.0等。
第二、屏幕分辨率
屏幕上顯示的像素個數,單位尺寸內像素點越多,顯示的圖像就越清楚。單位是px,1px=1個像素點。
分辨率720*1280表示手機水平方向的像素為720,垂直方向為1280.
市場上主流分辨率有:480*800、 720*1280、 1080*1920(其他的早該淘汰了,忽略不計)。
第三、屏幕密度
表示屏幕每英寸(inch)的物理長度內包含的像素點數(dots),即屏幕像素密度。 單位是dpi( Dots Per Inch)
DPI(Dots Per Inch)是印刷行業中用來度量空間點密度用的,這個值是打印機每英寸可以噴的墨汁點數。計算機顯示設備從打印機中借鑒了DPI的概念,由于計算機顯示設 備中的原子單位不是墨汁點而是像素,所以就創造了PPI(Pixels Per Inch),這個值是屏幕每英寸的像素數量,即像素密度(Screen density)。由于各種原因,目前PPI(主要是iOS)和DPI(主要在Android中)都會用在計算機顯示設備的參數描述中,不過二者的意思是一樣的,都是代表像素密度。
Android設備用DPI來表示屏幕密度(Density),屏幕密度大就表示一個Inch包含的Dot比較多。160DPI的屏幕就表示一個Inch包含160個Dot,320DPI的屏幕表示一個Inch有320個Dot,所以說Dot的大小是不固定的。高DPI屏幕顯示的元素會比較精細(看起來會比較小),低DPI屏幕顯示的元素相對來說就比粗糙(看起來會比較大)。
通常我們說一個設備是多少寸時,指的是屏幕對角線(Diagonal)長度是多少inch,所以用對角線的像素值(px)除以對角線長度(inch),就可以計算出PPI。
![]()
PPI 計算公式
為了簡化適配工作,Android根據屏幕大小(Inch)和屏幕密度(DPI)對設備做了如下劃分:
![]()
你需要把對應dpi的資源放到對應的目錄就可以了,Android會根據dpi自動選擇資源,目錄規則如下:
drawable-mdpi/asset.png
</li>drawable-hdpi/asset.png
</li>drawable-xhdpi/asset.png
</li>...
</li> </ul>可以看出Android中mdpi與iOS中的1x multiplier所代表的PPI是一樣的,xhdpi與iOS的2x multiplier所代表的PPI一樣,如圖:
![]()
![]()
第四、Andriod中的單位DP與SP
4.1 DP
既 然有那么多不同分辨率、不同大小的屏幕,使用PX必然會導致適配困難,為了進一步簡化適配工作,Android為我們提供了一個虛擬的像素單位 - DP 或者 DIP (Density-Independent pixel),當然也可以理解為 Device-Independent Pixel,即與設備屏幕密度無關的像素。為什么說是虛擬呢,因為它的大小不是一個物理(Phisical)值,而是由操作系統根據屏幕大小和密度動態渲染出來的。
PX跟DP之間的換算關系很簡單:
px = dp * (dpi / 160)
舉例來說,小米Pad的屏幕密度為326dpi,如果需要顯示的圖片大小為20dp,那么就需要提供一個 20*(326/160)=40px的圖片才能達到最佳顯示效果,如果還要適配一個163dpi的屏幕,那么還需要再提供一個20*(163/160)=20px的圖片。
那么一個20dp的圖片,在不同設備上的顯示效果如何呢?我們以iPad為例來說明。
![]()
iPad 屏幕參數
iPad2 和 iPad Retina的物理尺寸都是 9.7 inch,不同的是分辨率和PPI,一個是1024x768 / 132ppi,另一個是2048x1536 / 264ppi,分別計算一下20dp對應多少inch
ipad2 = 20 * (132 / 160) * (7.9 / (math.sqrt(1024 * 1024 + 768 * 768))) ipad_retina = 20 * (264 / 160) * (7.9 / (math.sqrt(2048 * 2048 + 1536 * 1536)))計算結果都是0.1018359375,這就是dp的功能,它能保證在所有的設備上顯示的大小都一樣。
4.2 SP
SP 全稱是 Scale-independent Pixels,用于字體大小,其概念與DP是一致的,也是為了保持設備無關。因為Android用戶可以根據喜好來調整字體大小,所以要使用sp來表示字體大小。
第五、Andriod Studio中的資源
res目錄下存放項目中的所有動畫、圖片、布局、字符串等資源。通常圖標放在mipmap目錄下,圖片放在drawable目錄下,布局放在layout目錄下,字符串放在values目錄下, 下面是詳細描述。
5.1 動畫資源(Animation Resources)
定義預先確定的動畫資源。
Tween動畫保存在res/anim/ 目錄下,通過R.anim 類來訪問.
Frame動畫保存在res/drawable/ 目錄下,通過 R.drawable 類來訪問.備注:動畫分為兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
5.2 顏色狀態列表資源
定義隨著View狀態而改變的顏色資源。
保存在 res/color/ 目錄下,通過 R.color 類來訪問.
5.3 icon資源
定義應用程序使用的圖標資源。
保存在res/mipmap目錄下,通過R.mipmap類來訪問.
5.4 Drawable資源
定義bitmap圖像或通過XML來定義的圖像資源.
保存在res/drawable/ 目錄下,通過R.drawable 類來訪問.
5.5 布局資源
定義應用程序UI的布局。
保存在res/layout/ 目錄下,通過R.layout 類來訪問.5.6 菜單資源
定義應用程序菜單的內容。
保存在res/menu/ 目錄下,通過R.menu 類來訪問.
5.7 String資源
定義串、串數組、和數量字符串(zero, one, two, few, many, other)plurals (并且包含串的格式化以及風格).
保存在res/values/ 目錄下,通過R.string, R.array, 以及R.plurals 類來訪問.
5.8 樣式(Style)資源
定義UI元素的外表與格式(look and format).
保存在res/values/ 目錄下,通過R.style 類來訪問.
5.9 更多的資源類型
定義諸如布爾值、顏色、維度、ID、整數值、整數數組、TypedArray的值.
保存在res/values/ 目錄下,但每一種是通過不同的 R 子類(諸如 R.bool, R.color, R.dimen, R.id, R.integer, R.array等)來訪問.
參考資料:
[1] 詳解Android開發中常用的 DPI/DP/SP, http://www.jianshu.com/p/913943d25829
[2] 移動開發需要知道的像素知識, http://weizhifeng.net/you-should-know-about-dpi.html
[3] 閑話Android 之 屏幕大小、pixel、分辨率、dpi、dip, http://www.cnblogs.com/zhangxinyan/p/3510604.html
[4] Andriod界面設計的分辨率和尺寸適配全攻略, http://www.25xt.com/appdesign/8693.html
[5] Resource Types, http://developer.android.com/intl/zh-cn/guide/topics/resources/available-resources.html
[6] More Resource Types, http://developer.android.com/intl/zh-cn/guide/topics/resources/more-resources.html
[7] Managing Projects Overview, http://developer.android.com/intl/zh-cn/tools/projects/index.html#ApplicationModules
</span>