package com.example.myapplication;
import android.app.Activity;
import android.app.Application;
import android.content.ComponentCallbacks;
import android.content.res.Configuration;
import android.util.DisplayMetrics;
import androidx.annotation.NonNull;
/**
* 屏幕适配Util
*/
public class MyDensityUtil {
/**
* 屏幕密度
*/
private static float sComponentDensity;
/**
* 屏幕显示字体的密度
*/
private static float sComponentScaledDensity;
/**
* 设置自定义的阿密度
*/
public static void setCustomDensity(Activity activity, Application application){
/**
* 显示器的信息类
*/
final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
if (sComponentDensity==0){
/**
* 获取机器的屏幕密度
*/
sComponentDensity = appDisplayMetrics.density;
/**
* 屏幕显示的字体密度
*/
sComponentScaledDensity = appDisplayMetrics.scaledDensity;
/**
* 字体切换监听,防止切换字体再返回应用字体无变化
*/
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
if (null!=newConfig&&newConfig.fontScale>0){
sComponentScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
/**
* 显示屏绝对宽度与UI宽度比例
* 以1080dp和宽维度来适配
*/
final float targetDensity = appDisplayMetrics.widthPixels/1080F;
/**
* 通过原本的ScaledDensity和Density获取比例从而得出现在的实际显示屏比例
*/
final float targetScaleDensity = targetDensity*(sComponentScaledDensity/sComponentDensity);
/**
* 参考默认密度
*/
final int targetDensityDpi = (int) (160*targetDensity);
/**
* 赋值到application中
*
*/
appDisplayMetrics.density = targetDensity;
appDisplayMetrics.scaledDensity = targetScaleDensity;
appDisplayMetrics.densityDpi = targetDensityDpi;
/**
* 赋值到activity的density中
*/
final DisplayMetrics actDisplayMetrics = activity.getResources().getDisplayMetrics();
actDisplayMetrics.density = targetDensity;
actDisplayMetrics.scaledDensity =targetScaleDensity;
actDisplayMetrics.densityDpi = targetDensityDpi;
}
}