android 屏幕dp值计算
google從android 3.2版本之后使用sw**dp方式來進(jìn)行多屏幕適配,那么屏幕的具體dp值多少?
為了確定設(shè)備屏幕的dp值,查找了些關(guān)于屏幕px,sp,dp值計算的資料。
這里呢,我把px2dp的方法貼出來以供大家參考:
公式也是蠻簡單的。為了了解更多的內(nèi)容信息,我這里呢查看了官方api的資料和源碼資料來做參考。
開發(fā)安卓應(yīng)用,總不免會遇到屏幕適配問題。google官方api也給我們講了非常多的適配方法,其中谷歌采用dp值的屏幕寬高度量單位目的就是為了在尺寸相近的設(shè)備屏幕上展示相近的界面效果,并且按照屏幕的像素密度ppi劃分了一些標(biāo)準(zhǔn),以供開發(fā)人員適配,大家都知道在android工程的res中的drawable可以使ldpi,mdpi,hdpi,xhdpi等限令名來按屏幕適配,這些劃分在源碼中也能很容易的找到:
android源碼中負(fù)責(zé)屏幕密度計算的類是DisplayMetrics。
在這個類的屬性變量聲明部分,我們看到了api中提到的屏幕密度分類(這里以android20版本源碼作為參考,其他版本原理一致):
注釋說明部分過長就不貼了,有興趣的朋友可以直接看源碼。我們從上面這一段屬性常量聲明可以看到google將現(xiàn)有的安卓設(shè)備按照屏幕密度分為了以上的幾個檔。因?yàn)樯a(chǎn)android設(shè)備廠家眾多,各家的產(chǎn)品不盡是
上述的屏幕密度,也會有很多其他密度參數(shù)的設(shè)備。那么,很顯然,我們按照上述幾個檔來計算寬高dp值的話也就順理成章的成為了近似值(這也正是尺寸相同的屏幕適配上出現(xiàn)了布局偏差的主因)。
另外,我們看到最后的一個常量聲明,從這里我們可以看出google是以160的mdpi作為標(biāo)準(zhǔn)密度值計算的。
那么,我們先來看看,DisplayMetrics到底能給我們拿回來什么數(shù)據(jù),按照源碼提供的該類的使用說明:
ok,DisplayMetrics 類說明直接告訴了我們使用方法:
DisplayMetrics mMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(mMetrics ); Log.d(TAG, mMetrics.toString());以我的手機(jī)為例,運(yùn)行結(jié)果如下:
DisplayMetrics 的toString方法已經(jīng)提供了很多有用信息包括了屏幕寬高的像素值,寬高的密度值以及一個密度比例值 density。
實(shí)際上,我們需要的數(shù)據(jù)已經(jīng)都準(zhǔn)備ok了,計算屏幕dp值直接就可以套用上面的px2dp值計算得出:
寬度dp值為:( int ) ( 1080 / 3.0 + 0.5f ) =360dp
高度dp值為:( int ) ( 1920 / 3.0 + 0.5f ) =640dp
我們繼續(xù)研究為什么我的手機(jī)屏幕獲取到的density是3.0。
我們查看源碼關(guān)于density的注釋已經(jīng)可以明白:
這個關(guān)于density的注釋說明已經(jīng)說的很清楚,那么在源碼中是怎么體現(xiàn)的呢:我們繼續(xù)在源碼中查找關(guān)于density的賦值位置:
public void setToDefaults() {widthPixels = 0;heightPixels = 0;density = DENSITY_DEVICE / (float) DENSITY_DEFAULT;densityDpi = DENSITY_DEVICE;scaledDensity = density;xdpi = DENSITY_DEVICE;ydpi = DENSITY_DEVICE;noncompatWidthPixels = widthPixels;noncompatHeightPixels = heightPixels;noncompatDensity = density;noncompatDensityDpi = densityDpi;noncompatScaledDensity = scaledDensity;noncompatXdpi = xdpi;noncompatYdpi = ydpi;}我們在這個方法中不僅找到了關(guān)于density的賦值操作,還發(fā)現(xiàn)了scaledDensity ,xdpi和ydpi的賦值操作。
按照上面提到的源碼中聲明了DENSITY_DEFAULT,以160的mdpi作為基準(zhǔn)密度來進(jìn)行屏幕密度度量的。那么我的手機(jī)屏幕密度就是 160*3.0 = 480dpi。
總結(jié)
以上是生活随笔為你收集整理的android 屏幕dp值计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【实验作业】微处理器原理与应用 CPUH
- 下一篇: 数据增强功能工具,选项功能对照表