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