import android.app.Activity;
import android.app.Application;
import android.content.ComponentCallbacks;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.support.annotation.NonNull;
import android.util.DisplayMetrics;
import android.util.Log;
/**
* 需要在AndroidManifest application下添加
* <meta-data
* android:name="design_width"
* android:value="360"/>
* 360是设计稿上宽度dp值
*/
public class ScreenAdapterUtil {
private static final String TAG = ScreenAdapterUtil.class.getName();
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(Configuration newConfig) {
if (newConfig != null && newConfig.fontScale > 0) {
sNonCompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
//默认dp
float designWidth = 360;
try {
ApplicationInfo appInfo = application.getPackageManager().getApplicationInfo(application.getPackageName(), PackageManager.GET_META_DATA);
designWidth = appInfo.metaData.getInt("design_width");
} catch (Exception e) {
Log.e(TAG,"Exception:"+ e);
}
Log.d(TAG,"designWidth = "+designWidth);
final float targetDensity = appDisplayMetrics.widthPixels / designWidth;
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;
setBitmapDefaultDensity(targetDensity);
}
/**
* 设置 Bitmap 的默认屏幕密度
* 由于 Bitmap 的屏幕密度是读取配置的,导致修改未被启用
* 所有,放射方式强行修改
*
* @param defaultDensity 屏幕密度
*/
private static void setBitmapDefaultDensity(float defaultDensity) {
//获取单个变量的值
Class clazz;
try {
clazz = Class.forName("android.graphics.Bitmap");
Field field = clazz.getDeclaredField("sDefaultDensity");
field.setAccessible(true);
field.set(null, defaultDensity);
field.setAccessible(false);
} catch (ClassNotFoundException e) {
} catch (NoSuchFieldException e) {
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
注:在 setContentView() 前调用
参考 今日头条技术团队