Android屏幕适配之修改系统density

时间:2024-10-01 07:40:34
今日头条屏幕适配思路

Android中xml布局文件中写的是什么单位最终会转化成px
#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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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

dip = value * ;

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

实现

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

case COMPLEX_UNIT_DIP:
            return value * metrics.density;
  • 1
  • 2

如果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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

验证

720* 1080分辨率手机 density = 2
在这里插入图片描述


1080*1920分辨率手机 density=3

在这里插入图片描述


今日头条屏幕适配方案