美文网首页适配
玩安卓---今日头条的屏幕适配

玩安卓---今日头条的屏幕适配

作者: 努力生活的西鱼 | 来源:发表于2019-05-18 22:24 被阅读62次

今日头条的屏幕适配

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;
}

参考:
今日头条适配方案

相关文章

网友评论

    本文标题:玩安卓---今日头条的屏幕适配

    本文链接:https://www.haomeiwen.com/subject/rmuxzqtx.html