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;
|
}
|
}
|