package com.android.app_base.utils; import android.app.Activity; import android.app.Application; import android.content.ComponentCallbacks; import android.content.Context; import android.content.res.Configuration; import android.util.DisplayMetrics; import androidx.annotation.DimenRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.app_base.base.BaseApplication; /** * @author Ljj * @date 2023.03.13. 17:40 * @desc 屏幕尺寸转化工具类 */ public class ScreenSizeUtils { /** * 计算当前的SP的值 * @param context * @param spSize :R.dimen.sp_16 * @return */ public static int getSP(Context context, @DimenRes int spSize){ float pxValue = context.getResources().getDimension(spSize);//获取对应资源文件下的sp值 //将px值转换成sp值 return px2sp(context, pxValue); } /** * 计算当前的DP的值 * @param context * @param dpSize :R.dimen.dp_16 * @return */ public static int getDP(Context context,@DimenRes int dpSize){ float pxValue = context.getResources().getDimension(dpSize);//获取对应资源文件下的sp值 //将px值转换成dp值 return px2dip(context, pxValue); } /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { if (context == null) { return (int) dpValue; } final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } public static int dip2px(float dpValue) { final float scale = BaseApplication.getInstance().getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px2dip(Context context, float pxValue) { if (context == null) { return (int) pxValue; } final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * px转换为sp * @param context * @param pxValue * @return */ public static int px2sp(Context context,float pxValue){ if (context == null) { return (int) pxValue; } final float scale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / scale + 0.5f); } public static int getScreenWidth(Context context){ DisplayMetrics dm = context.getResources().getDisplayMetrics(); if(dm != null)return dm.widthPixels; return 0; } public static int getScreenHeight(Context context){ DisplayMetrics dm = context.getResources().getDisplayMetrics(); if(dm != null)return dm.heightPixels; return 0; } //今日头条屏幕适配方案 private static float sNoncompatDensity; private static float sNoncompatScaledDensity; public static void setCustomDensity(@NonNull Activity activity, @NonNull final Application application){ final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics(); if (sNoncompatDensity == 0){ sNoncompatDensity = appDisplayMetrics.density; sNoncompatScaledDensity = appDisplayMetrics.scaledDensity; application.registerComponentCallbacks(new ComponentCallbacks() { @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { if (newConfig != null && newConfig.fontScale > 0){ sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity; } } @Override public void onLowMemory() { } }); } final float targetDensity = appDisplayMetrics.widthPixels / 360; final float targetScaledDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity); final int targetDensityDpi = (int) (160*targetDensity); appDisplayMetrics.density = targetDensity; appDisplayMetrics.scaledDensity = targetScaledDensity; appDisplayMetrics.densityDpi = targetDensityDpi; final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics(); activityDisplayMetrics.density = targetDensity; activityDisplayMetrics.scaledDensity = targetScaledDensity; activityDisplayMetrics.densityDpi = targetDensityDpi; } }