各个屏幕参数
原理
一句话概括:动态修改手机的像素密度(density)
我们需要修改3个值:
1.density(像素密度)😮
显示的逻辑密度。这是一个比例因子密度无关的像素单位,其中一个倾角是一个像素上的大约160 dpi屏幕(例如240x320, 1.5"x2"屏幕),提供系统显示的基线。因此在160dpi的屏幕上此密度值为1;在120dpi屏幕上是0.75;等。此值并不完全符合实际屏幕大小(如xdpi和ydpi,而是用于缩放的大小
根据显示dpi中的总变化,分步骤显示整个UI。为例如,一个240×320屏幕的密度为1,即使它的宽度为1、*1.8"、1.3"等但是,如果屏幕分辨率增加到 320x480,但屏幕大小仍为1.5“x2”,则密度为增加(可能到1.5)。
2.scaleDensity(字体缩放)😮
显示在屏幕上的字体的比例因子。这是一样的为{@link #density},但可以在较小的范围内进行调整在运行时根据用户对字体大小的偏好递增。
3.densityDpi(屏幕密度)😮
屏幕密度以点/英寸表示。可以是DENSITY_LOW, DENSITY_MEDIUM,或DENSITY_HIGH。
例子
public class DensityUtil{
//这个位置填写的是设计稿的宽度
private static final int WIDTH=750;
//这个位置填写的是原始屏幕密度
private int density;
//原始屏幕的字体缩放值
private int scaleDensity;
//TODO 开始根据设计稿来进行适配
public static void setDensity(Activity activity){
//如果屏幕尺寸为0,则需要我们进行获取
if(density==0){
WindowManager manager=activity.getSystem(Context.WINDOW_SYSTEM);
DisplayMetrics displayMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(displayMetrics);
density=displayMetrics.density;
scaleDensity=displayMetrics.scaleDensity;
}
//通过计算进行转换
float targetDensity = displayMetrics.widthPixels / WIDTH;
float scaledDensity = targetDensity * (displayMetrics.scaledDensity / displayMetrics.density);
int densityDip = (int) (targetDensity * 160);
//将修改后的值赋值给activity窗体
DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
displayMetrics.density = targetDensity;
displayMetrics.scaledDensity = scaledDensity;
displayMetrics.densityDpi = densityDip;
}
}
在我们的activity中进行使用
public class SplashActivity extends BaseActivity<ActivitySplashBinding, MainP> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
DensityUtil.setDensity(this);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
}
}
查看一下效果吧
注:需要注意的地方是工具类要在setContentView()方法之前运行,否则没有效果。
顺便推荐一下Git上很火的屏幕适配的库
最近我一直在迷茫自己这么菜到底应该怎么学习才好?
最后想清楚了一步一步来,分享一下领悟的话:
我们只有不断前行,才知道前方的风景是多么的美丽,
不在意世俗的眼光,走自己最稳健的步伐,哪怕进步的很慢。