package com.xw.common.utils import android.app.Activity import android.app.Application import com.xw.common.utils.LogUtils class ScreenAdaptationUtil { companion object { var TAG = "ScreenAdaptationUtil" // 系统初始适配值 private var systemDefaultDensity = 0f private var systemDefaultDensityDpi = 0 private var systemDefaultScaledDensity = 0f @JvmStatic fun setCustomDensity(activity: Activity, application: Application) { setCustomDensity(activity, application, 375f) } fun setCustomDensity(activity: Activity, application: Application, designDp: Float) { /** * android中适配的单位换算值 * px = density * dp; * density = dpi / 160; * px = dp * (dpi / 160); * * dpi是根据屏幕真实的分辨率和尺寸来计算的,每个设备都可能不一样的。 * * dpi= (宽平方 + 高平方) 开根 / 屏幕尺寸 * */ val displayMetrics = application.resources.displayMetrics if (systemDefaultDensity == 0f) { systemDefaultDensity = displayMetrics.density } if (systemDefaultDensityDpi == 0) { systemDefaultDensityDpi = displayMetrics.densityDpi } if (systemDefaultScaledDensity == 0f) { systemDefaultScaledDensity = displayMetrics.scaledDensity } var fc = activity.resources.configuration.fontScale fc = 1f // 强制字体大小不随系统 /** * 此处以540dp的设计图作为例子 此处需要加上f int / int 得值 int 会导致适配有变形 */ val targetDensity = displayMetrics.widthPixels / designDp val targetScaledDensity = targetDensity * (systemDefaultScaledDensity / fc / systemDefaultDensity) val targetDensityDpi = (160 * targetDensity).toInt() displayMetrics.density = targetDensity displayMetrics.scaledDensity = targetScaledDensity displayMetrics.densityDpi = targetDensityDpi val activityDisplayMetrics = activity.resources.displayMetrics activityDisplayMetrics.density = targetDensity activityDisplayMetrics.scaledDensity = targetScaledDensity activityDisplayMetrics.densityDpi = targetDensityDpi } /** * 取消屏幕适配 * * @param activity * @param application */ @JvmStatic fun restoreCustomDensity(activity: Activity, application: Application) { if (systemDefaultDensity == 0f || systemDefaultScaledDensity == 0f || systemDefaultDensityDpi == 0) { // LogUtils.e(TAG, "重置失败,系统初始适配值错误") return } val displayMetrics = application.resources.displayMetrics displayMetrics.density = systemDefaultDensity displayMetrics.scaledDensity = systemDefaultScaledDensity displayMetrics.densityDpi = systemDefaultDensityDpi val activityDisplayMetrics = activity.resources.displayMetrics activityDisplayMetrics.density = systemDefaultDensity activityDisplayMetrics.scaledDensity = systemDefaultScaledDensity activityDisplayMetrics.densityDpi = systemDefaultDensityDpi } } }