美文网首页
屏幕适配(三)——修改系统density

屏幕适配(三)——修改系统density

作者: 王志强_9380 | 来源:发表于2019-09-26 19:32 被阅读0次

    从之前的文章我们知道,系统最终会把我们的dp、sp等转换为px来绘图,而转换比例和density、scaledDensity有关,那么,我们可以直接修改系统的density值,来达到自动适配的目的

    public class Density {
    
        private static final float  WIDTH = 1080;//参考设备的宽
    
        private static float appDensity;//表示屏幕密度
        private static float appScaleDensity; //字体缩放比例,默认appDensity
    
        public static void setDensity(final Application application, Activity activity){
            //获取当前app的屏幕显示信息
            DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
            if (appDensity == 0){
                //初始化赋值操作
                appDensity = displayMetrics.density;
                appScaleDensity = displayMetrics.scaledDensity;
                //添加字体变化监听回调
                application.registerComponentCallbacks(new ComponentCallbacks() {
                    @Override
                    public void onConfigurationChanged(Configuration newConfig) {
                        //字体发生更改,重新对scaleDensity进行赋值
                        if (newConfig != null && newConfig.fontScale > 0){
                            appScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;
                        }
                    }
                    @Override
                    public void onLowMemory() {
    
                    }
                });
            }
            //计算目标值density, scaleDensity, densityDpi
            float targetDensity = 1;
            if (displayMetrics.widthPixels > displayMetrics.heightPixels) {
                //横屏
                targetDensity = displayMetrics.heightPixels / WIDTH;
            } else {
                targetDensity = displayMetrics.widthPixels / WIDTH;
            }
            float targetScaleDensity = targetDensity * (appScaleDensity / appDensity);
            int targetDensityDpi = (int) (targetDensity * 160);
    
            //替换Activity的density, scaleDensity, densityDpi
            DisplayMetrics dm = activity.getResources().getDisplayMetrics();
            dm.density = targetDensity;
            dm.scaledDensity = targetScaleDensity;
            dm.densityDpi = targetDensityDpi;
        }
    
    }
    

    首先,通过application.getResources().getDisplayMetrics();获取到系统默认的值,然后通过displayMetrics.widthPixels/WIDTH,得到目标density,这个就是实际屏幕分辨率和基准值比例
    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <TextView
            android:text="200*320px"
            android:layout_width="200px"
            android:layout_height="320px"
            android:background="#5f0f" />
        <TextView
            android:text="200*320dp"
            android:layout_width="200dp"
            android:layout_height="320dp"
            android:background="#5ff0" />
    </LinearLayout>
    

    然后在Activity的setContentView之前调用Density.setDensity(getApplication(),this);

    测试机
    机器 尺寸(英寸) widthPixels heightPixels 对角线 计算出的densityDpi densityDpi density
    机器D 6 2160 1080 2415 402.5 420 2.625

    看下效果


    device-2019-09-20-111242_spec.png

    相关文章

      网友评论

          本文标题:屏幕适配(三)——修改系统density

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