Android屏幕适配之修改系统density

今日头条屏幕适配思路

Android中xml布局文件中写的是什么单位最终会转化成px
android.util.TypedValue#applyDimension

public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics)
    {
     
        switch (unit) {
     
        case COMPLEX_UNIT_PX:
            //	px
            return value;
        case COMPLEX_UNIT_DIP:
            //	dp * density
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
        	//	sp * scaledDensity
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }

我们在开发过程中,主要用px、dip、sp这三种单位比较多一些

dip = value * metrics.density;

通过上面返回值可以发现 dip = value * DisplayMetrics.density
如果能把DisplayMetrics里面的density常量值进行修改,不就可以在不用分辨率手机缩放显示一样的效果。

实现

我的手机宽度是720px,宽度是360dp

case COMPLEX_UNIT_DIP:
            return value * metrics.density;

如果ui给出设计图总宽度为 360 dp,那么如果有一个控件在设计图上的宽为180dp、高为180dp那么这个控件宽度占整个设计图宽度的一半 (180 / 360 = 0.5)

(dp * density = px)
系统最后将高宽dp都换算成 px,180dp * 2 = 360px

public class Density {
     
    //ui参考设备的宽,dp
    private static final float WIDTH = 360;
    private static float appDensity;
	
    public static void setDensity(final Application application, Activity activity) {
     
        DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
        if (appDensity == 0) {
     
            appDensity = displayMetrics.density;
        }
        //计算目标值density,densityDpi
        float targetDensity = displayMetrics.widthPixels / WIDTH;
        int targetDensityDpi = (int) (targetDensity * 160);
        DisplayMetrics dm = activity.getResources().getDisplayMetrics();
        dm.density = targetDensity;
        dm.densityDpi = targetDensityDpi;
    }
}

验证

720* 1080分辨率手机 density = 2
Android屏幕适配之修改系统density_第1张图片


1080*1920分辨率手机 density=3

Android屏幕适配之修改系统density_第2张图片


今日头条屏幕适配方案

你可能感兴趣的:(屏幕适配,Android知识,Android,android,安卓,app)