今日头条的屏幕适配
DPI
DPI: 计算1英寸面积内像素的多少,即像素的密度。代表的是屏幕对角线每英寸的像素个数。
640.png
举个例子:屏幕分辨率为:1920*1080,屏幕尺寸为5吋的话,那么dpi为440
640 (1).png
Density
密度,是一个比例值,计算公式:densuty = dpi / 160 像素/英寸,160像素/英寸是Android定义的一个标准(计算规范),至于原因是当前的主流是120,160,240,320,480,对应的密度是0.75,1,1.5,2,3正好存在整除关系,要用其他做标准不存在整除关系,精确度低。
/**
* 今日头条适配方案 修改设备密度
* 支持以宽或者高一个维度去适配,保持该维度上和设计图一致
* 当前设备总宽度(px) / 设计图总宽度(dp) = density
* density: 1dp 占当前设备的多少像素
* 在BaseActivity的onCreate()中引用即可
* @param activity
* @param application
*/
private static float sNoncompatDensity;
private static float sNoncompatScaledDensity;
public static void setCustomDensity(@NonNull Activity activity, @NonNull final Application application) {
final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
if (sNoncompatDensity == 0) {
// 系统显示器的逻辑密度
sNoncompatDensity = appDisplayMetrics.density;
// 字体的缩放系数,与density相同
sNoncompatScaledDensity = appDisplayMetrics.scaledDensity;
// 监听字体切换,防止系统切换后不起作用
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig != null && newConfig.fontScale > 0) {
sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
// 目标密度 屏幕宽度(px) / 设计图的宽度(dp), 这里是以小米6X为例
float targetDensity = appDisplayMetrics.widthPixels / 432;
// 目标缩放密度
float targetScaleDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity);
// 目标DPI
int targetDensityDpi = (int) (160 * targetDensity);
appDisplayMetrics.density = targetDensity;
appDisplayMetrics.scaledDensity = targetScaleDensity;
appDisplayMetrics.densityDpi = targetDensityDpi;
final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayMetrics.density = targetDensity;
activityDisplayMetrics.scaledDensity = targetScaleDensity;
activityDisplayMetrics.densityDpi = targetDensityDpi;
}
参考:
今日头条适配方案
网友评论