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

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

作者: 努力生活的西鱼 | 来源:发表于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