-
屏幕適配不得不提到屏幕密度如何計(jì)算
屏幕密度計(jì)算.png
比如 1920px*1080px 5英寸:
√(1920^2 +1080^2)=2202.9071700823
2202.9071700823/5=440.5814340165(ppi)≈440ppi
存在問(wèn)題
一般我們?cè)O(shè)計(jì)圖都是以固定的尺寸來(lái)設(shè)計(jì)的。比如以分辨率1920px * 1080px來(lái)設(shè)計(jì),以density為3來(lái)標(biāo)注,也就是屏幕其實(shí)是640dp * 360dp。
而實(shí)際上以上面的例子來(lái)說(shuō)440dpi/160 = 2.75(即1dp = 2.75px)而UI給的標(biāo)注是(1dp = 3px),所以無(wú)法在不同設(shè)備上顯示為同樣效果的。android中的dp在渲染前會(huì)將dp轉(zhuǎn)為px,計(jì)算公式:
px = density * dp;
density = dpi / 160;
px = dp * (dpi / 160);如何適配
支持以寬或者高一個(gè)維度去適配,保持該維度上和設(shè)計(jì)圖一致;
支持dp和sp單位,控制遷移成本到最小。
從dp和px的轉(zhuǎn)換公式 :px = dp * density
可以看出,如果設(shè)計(jì)圖寬為360dp,想要保證在所有設(shè)備計(jì)算得出的px值都正好是屏幕寬度的話,我們只能修改 density 的值。方案(下面假設(shè)設(shè)計(jì)圖寬度是360dp,以寬維度來(lái)適配)
由于字體也是用dp(不是用sp)進(jìn)行設(shè)置的,所以字體也能進(jìn)行適配
Activity的onCreate()進(jìn)行調(diào)用
先來(lái)熟悉下 DisplayMetrics 中和適配相關(guān)的幾個(gè)變量:
DisplayMetrics#density 就是上述的density
DisplayMetrics#densityDpi 就是上述的dpi
DisplayMetrics#scaledDensity 字體的縮放因子,正常情況下和density相等,但是調(diào)節(jié)系統(tǒng)字體大小后會(huì)改變這個(gè)值
public class ScreenAdaptationUtil {
public static void setCustomDensity(@NonNull Activity activity, @NonNull Application application) {
final DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
final float targetDensity = displayMetrics.widthPixels / 360;
final int targetDensityDpi = (int) (160 * targetDensity);
displayMetrics.density = displayMetrics.scaledDensity = targetDensity;
displayMetrics.densityDpi = targetDensityDpi;
final DisplayMetrics activityDisplayDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayDisplayMetrics.density = activityDisplayDisplayMetrics.scaledDensity = targetDensity;
activityDisplayDisplayMetrics.densityDpi = targetDensityDpi;
}
}
