Open
Description
原因是我的工程代码里调用了方法来调整了系统的屏幕密度值,导致您这儿弹出的更新对话框布局不正确,看效果图如下:我希望您能帮忙告知我如何适配您的布局?
方法代码是:
/**
改变系统的屏幕密度值,建议在BaseActivity.onCreate()和BaseActivity.onStart()中均执行。
这个方法的用途比如:
1、在逍遥模拟器中的屏幕宽高像素值和dpi值对应不上,如1080x1920的手机,dpi一般应该为480,而其实际为288偏小,从而造成了所有应用(不止是我们的app)看上去控件偏小,所以就需要调整下系统的屏幕密度值以使得界面控件正常大小显示。
2、在华为SCL-TL00型号手机上,其为5英寸分辨率是720x1280,density原值为2,但其值严格应该为1.8,从而造成了应用看上去控件偏大。
备注:
1、如果修改了设备的屏幕密度等值,影响范围仅在应用内,不影响其他应用;
2、在对话框弹出高度为WRAP_CONTENT时,部分设备的实际弹出框高度会不足从而造成显示不全!
3、Fresco图片加载框架中的SimpleDraweeView控件经测会受修改屏幕密度值的影响,从而使得其图片大小显示不正确。
@param context 要改变密度值的页面
*/
public static void resetToTargetDensity(Context context) {
LogX.d(context.getClass().getSimpleName() + "窗口原密度值:" + ScreenUtil.getDensityScale(context));
Application application = BaseApplication.getInstance();
DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
if (mDensityScale == 0) {
mDensityScale = displayMetrics.density;
mFontDensityScale = displayMetrics.scaledDensity;
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig != null && newConfig.fontScale > 0) {
mFontDensityScale = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
float targetDensityScale;
if (ScreenUtil.isScreenOriatationPortrait(context)) {
targetDensityScale = displayMetrics.heightPixels / 640f;//如1920/640=3.0,其中640是参考设备的高,单位是dp
} else {
targetDensityScale = displayMetrics.heightPixels / 420f;//横屏时调整密度值低一些,因为我不希望控件高度太高显得太占用空间。
}
float targetFontDensityScale = targetDensityScale * (mFontDensityScale / mDensityScale);
int targetDensityDpi = (int) (targetDensityScale * 160);
displayMetrics.density = targetDensityScale;
displayMetrics.scaledDensity = targetFontDensityScale;
displayMetrics.densityDpi = targetDensityDpi;
//虽然以上已经改变了Application中的密度值,在大多页面会生效,但有一种情况比如平板模拟器中打开竖屏App,会发现以上修改的密度值无效,还需要单独设置Activity的密度值。
final DisplayMetrics activityDisplayMetrics = context.getResources().getDisplayMetrics();
activityDisplayMetrics.density = targetDensityScale;
activityDisplayMetrics.scaledDensity = targetFontDensityScale;
activityDisplayMetrics.densityDpi = targetDensityDpi;
LogX.d(context.getClass().getSimpleName() + "窗口现密度值:" + ScreenUtil.getDensityScale(context));
}
Metadata
Metadata
Assignees
Labels
No labels