android 屏幕尺寸适配实现方案
前言:一直在網上看到很多的屏幕尺寸適配方法,并沒有做系統的總結,最近一個項目里面又要做適配,索性就整理了一下這方面的知識點。
一、一般網上有關的屏幕適配方案:
http://www.cocoachina.com/android/20151030/13971.html
這篇個人覺得闡述的很全面,技術點很全、原理說明等方面都是說的很好的,里面有關于重要概念、解決方案等說的很詳細。
比如:
1)基本概念
屏幕尺寸
屏幕尺寸指屏幕的對角線的長度,單位是英寸,1英寸=2.54厘米
比如常見的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等
屏幕分辨率
屏幕分辨率是指在橫縱向上的像素點數,單位是px,1px=1個像素點。一般以縱向像素*橫向像素,如1960*1080。
屏幕像素密度
屏幕像素密度是指每英寸上的像素點數,單位是dpi,即“dot per inch”的縮寫。屏幕像素密度與屏幕尺寸和屏幕分辨率有關,在單一變化條件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。
dp、dip、dpi、sp、px
px我們應該是比較熟悉的,前面的分辨率就是用的像素為單位,大多數情況下,比如UI設計、Android原生API都會以px作為統一的計量單位,像是獲取屏幕寬高等。
dip和dp是一個意思,都是Density Independent Pixels的縮寫,即密度無關像素,上面我們說過,dpi是屏幕像素密度,假如一英寸里面有160個像素,這個屏幕的像素密度就是160dpi,那么在這種情況下,dp和px如何換算呢?在Android中,規定以160dpi為基準,1dip=1px,如果密度是320dpi,則1dip=2px,以此類推。
假如同樣都是畫一條320px的線,在480*800分辨率手機上顯示為2/3屏幕寬度,在320*480的手機上則占滿了全屏,如果使用dp為單位,在這兩種分辨率下,160dp都顯示為屏幕一半的長度。這也是為什么在Android開發中,寫布局的時候要盡量使用dp而不是px的原因。
而sp,即scale-independent pixels,與dp類似,但是可以根據文字大小首選項進行放縮,是設置字體大小的御用單位。
mdpi、hdpi、xdpi、xxdpi
其實之前還有個ldpi,但是隨著移動設備配置的不斷升級,這個像素密度的設備已經很罕見了,所在現在適配時不需考慮。
mdpi、hdpi、xdpi、xxdpi用來修飾Android中的drawable文件夾及values文件夾,用來區分不同像素密度下的圖片和dimen值。
那么如何區分呢?Google官方指定按照下列標準進行區分:
在進行開發的時候,我們需要把合適大小的圖片放在合適的文件夾里面。下面以圖標設計為例進行介紹。
在設計圖標時,對于五種主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)應按照 2:3:4:6:8 的比例進行縮放。例如,一個啟動圖標的尺寸為48x48 dp,這表示在 MDPI 的屏幕上其實際尺寸應為 48x48 px,在 HDPI 的屏幕上其實際大小是 MDPI 的 1.5 倍 (72x72 px),在 XDPI 的屏幕上其實際大小是 MDPI 的 2 倍 (96x96 px),依此類推。
雖然 Android 也支持低像素密度 (LDPI) 的屏幕,但無需為此費神,系統會自動將 HDPI 尺寸的圖標縮小到 1/2 進行匹配。
下圖為圖標的各個屏幕密度的對應尺寸:
2)解決方案:
比如布局的時候,多使用權重、百分比等方案,但是這些都沒有實際地結合Demo進行說明,下面,結合個人項目的實際開發,進行適配的方案說明:
二、我的適配方案:
1.項目要求:項目要求適配1280*720以及1920*1080兩種屏幕,以下面兩個手機的參數作為例子說明:
2.項目圖片的適配:
1)根據要去適配的機型及其分辨率、像素密度來要求美工切好對應尺寸的矢量圖,如:這里使用的兩個手機分別為:320dpi、420dpi,相應的需要準備XHDPI、XXHDPI 兩套圖;
2)一般的,android上習慣以1280*720作為一個基準進行尺寸的標注,原因可能是1280*720的分辨率下,屏幕密度為320dpi,剛剛好為160dpi的2倍,px與dp之間的換算及向上、向下兼容的時候比較方便(具體是不是這個原因,沒有進一步深究,對這個了解的比較好的,歡迎大神指教);
3)緊接著,把切好的圖片文件對應的放在項目的res資源文件夾下:
(需要注意的是:同一樣式的圖片文件,需要使用同一個命名,這樣不同的分辨率手機下加載的時候,手機才能正常識別)
4)最后,apk打包運行的時候,系統會根據不同的手機分辨率到對應的資源文件夾下加載對應的圖片資源。
3.尺寸的適配:
尺寸的適配是比較繁雜、也是比較困難的事。我們知道,android的屏幕分辨率、像素密度、尺寸種類是非常多的,所以,我們不可能百分之百把所有的機型都做到適配,只能選擇其中市場占比大的機型來做適配。根據我所了解到的尺寸適配,主要可以分為dp和px適配兩種方式:
dp適配
我們知道,一英寸里面有160個像素,這個屏幕的像素密度就是160dpi,這種情況下,在Android中,規定以160dpi為基準,1dpi=1px,如果密度是320dpi,則1dpi=2px,以此類推。如果使用dp值,則其在android系統中加載的過程是這樣的:首先,手機根據自身的屏幕密度與控件上具體的dp值進行換算,變成px值,然后,才在屏幕中顯示,即:屏幕最后在屏幕上顯示,使用的還是px值,dp只是android開發中使用的一個像素密度無關的單位
還有一個需要注意的問題是:dp值在xml文件中具體使用之后的效果是:當某一控件的尺寸在xml布局文件中確定之后,其無論在什么分辨率的手機上顯示的絕對尺寸都是一樣的,如:height為200px,則在1280*720中,dp=200/(320p/160p)=100,英寸=200px/320dpi=0.625,而在1920*1080中,100dp=100dp/(480p/160p)=300px,英寸=300px/480dpi=0.625。
1)首先,我們要知道的一點是:安卓會自動根據手機的大小(按寬度算 dp為單位)去選擇values或者values-swxxxdp下面的dimens.xml文件中的尺寸(所以,我們需要根據適配的要求計算出對應的寬度dp值,然后在res文件夾下創建對應的dimens.xml文件);
需要說明的是:基準值的dimens.xml文件定義放在values下的dimens.xml,其他的適配尺寸,需要創建并定義。
2)以例子中的letv x520及 xiaomi Redmi 4x 寬度為例:
letv x520:dp=160*1080/420=411
xiaomi Redmi 4x: dp=160*72/320=360
即:dp=160*widthPixels / density
基本上,360dp這個寬度的dp值在android中使用并作為基準值是比較常用的,因此,我們就在res文件夾下以360dp作為一個基準值,在values文件下的dimens.xml定義:按照這個基準,所有的寬度切成360dp份,其他的尺寸基于這個基準等比縮放;letv x520的寬度dp值為411,則需要創建“values-sw411dp/dimens.xml”文件:
對于1280x720的屏幕,寬度給“values/dimens.xml”dp_360變量的值即占滿屏幕;對于1920*1080的屏幕,寬度給“values-sw411dp/dimens.xml”下的dp_360(即:411dp)變量的值即占滿屏幕寬度給其他尺寸以此類推。
這樣,就完成了dp方案的尺寸適配。
適配之后,配置的尺寸使用:
px適配
px適配與dp適配事實上同出一轍,依然是需要根據適配要求,確定基準的分辨率(一般還是以1280*720作為基準),如:
以1280x720為基準,把所有的寬度切成720份,高度切成1280份,其他的尺寸基于這個基準等比縮放。
對于1280x720的屏幕,寬度給x720變量的值即占滿屏幕。
或者,用戶的手機屏幕為800x480:
根據不同的屏幕,x720變量會代表對應的px值,其他的變量也一樣,
這樣,就完成了px方案的尺寸適配。
以上就是我在項目中實際使用的適配方案,其中,dp方案是項目中實際使用的,px參考了
https://blog.csdn.net/fesdgasdgasdg/article/details/52325590
這位大神的博客進行了說明。
不對之處,歡迎指出。
參考博客:https://blog.csdn.net/fesdgasdgasdg/article/details/52325590
總結
以上是生活随笔為你收集整理的android 屏幕尺寸适配实现方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言long和short,long和s
- 下一篇: sis最新ip地址2020入口一_202