JessYanCoding / JessYanCoding/AndroidAutoSize

横屏时对竖屏弹窗等重复使用的UI放大问题的优化,是否存在更优解?

Đang mở
#297 4 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Java
Star
13.7k
Fork
2k
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

非常感谢楼主的分享:

问题: 横屏时 打开一个竖屏使用的弹窗 UI元素过大的优化。

解决:AutoSize.java
```

private static DisplayMetricsInfo mCacheMetricsInfo;

public static void autoConvertDensity(Activity activity, float sizeInDp, boolean isBaseOnWidth) {
Preconditions.checkNotNull(activity, "activity == null");
Preconditions.checkMainThread();

float subunitsDesignSize = isBaseOnWidth ? AutoSizeConfig.getInstance().getUnitsManager().getDesignWidth()
: AutoSizeConfig.getInstance().getUnitsManager().getDesignHeight();
subunitsDesignSize = subunitsDesignSize > 0 ? subunitsDesignSize : sizeInDp;

//第一次计算密度之后,以后一直使用该值,保证所有页面使用相同大小
float targetDensity = 0;
int targetDensityDpi = 0;
float targetScaledDensity = 0;
float targetXdpi = 0;
int targetScreenWidthDp;
int targetScreenHeightDp;

if (mCacheMetricsInfo == null) {
if (isBaseOnWidth) {
targetDensity = AutoSizeConfig.getInstance().getScreenWidth() * 1.0f / sizeInDp;
} else {
targetDensity = AutoSizeConfig.getInstance().getScreenHeight() * 1.0f / sizeInDp;
}
if (AutoSizeConfig.getInstance().getPrivateFontScale() > 0) {
targetScaledDensity = targetDensity * AutoSizeConfig.getInstance().getPrivateFontScale();
} else {
float systemFontScale = AutoSizeConfig.getInstance().isExcludeFontScale() ? 1 : AutoSizeConfig.getInstance().
getInitScaledDensity() * 1.0f / AutoSizeConfig.getInstance().getInitDensity();
targetScaledDensity = targetDensity * systemFontScale;
}
targetDensityDpi = (int) (targetDensity * 160);

targetScreenWidthDp = (int) (AutoSizeConfig.getInstance().getScreenWidth() / targetDensity);
targetScreenHeightDp = (int) (AutoSizeConfig.getInstance().getScreenHeight() / targetDensity);

if (isBaseOnWidth) {
targetXdpi = AutoSizeConfig.getInstance().getScreenWidth() * 1.0f / subunitsDesignSize;
} else {
targetXdpi = AutoSizeConfig.getInstance().getScreenHeight() * 1.0f / subunitsDesignSize;
}

mCacheMetricsInfo = new DisplayMetricsInfo(targetDensity, targetDensityDpi, targetScaledDensity, targetXdpi, targetScreenWidthDp, targetScreenHeightDp);
} else {
targetDensity = mCacheMetricsInfo.getDensity();
targetDensityDpi = mCacheMetricsInfo.getDensityDpi();
targetScaledDensity = mCacheMetricsInfo.getScaledDensity();
targetXdpi = mCacheMetricsInfo.getXdpi();
targetScreenWidthDp = mCacheMetricsInfo.getScreenWidthDp();
targetScreenHeightDp = mCacheMetricsInfo.getScreenHeightDp();
}

setDensity(activity, targetDensity, targetDensityDpi, targetScaledDensity, targetXdpi);
setScreenSizeDp(activity, targetScreenWidthDp, targetScreenHeightDp);

AutoSizeLog.d(String.format(Locale.ENGLISH, "The %s has been adapted! \n%s Info: isBaseOnWidth = %s, %s = %f, %s = %f, targetDensity = %f, targetScaledDensity = %f, targetDensityDpi = %d, targetXdpi = %f, targetScreenWidthDp = %d, targetScreenHeightDp = %d"
, activity.getClass().getName(), activity.getClass().getSimpleName(), isBaseOnWidth, isBaseOnWidth ? "designWidthInDp"
: "designHeightInDp", sizeInDp, isBaseOnWidth ? "designWidthInSubunits" : "designHeightInSubunits", subunitsDesignSize
, targetDensity, targetScaledDensity, targetDensityDpi, targetXdpi, targetScreenWidthDp, targetScreenHeightDp));
}

/**
* 取消适配
*
* @param activity {@link Activity}
*/
public static void cancelAdapt(Activity activity) {
Preconditions.checkMainThread();
float initXdpi = AutoSizeConfig.getInstance().getInitXdpi();
switch (AutoSizeConfig.getInstance().getUnitsManager().getSupportSubunits()) {
case PT:
initXdpi = initXdpi / 72f;
break;
case MM:
initXdpi = initXdpi / 25.4f;
break;
default:
}
setDensity(activity, AutoSizeConfig.getInstance().getInitDensity()
, AutoSizeConfig.getInstance().getInitDensityDpi()
, AutoSizeConfig.getInstance().getInitScaledDensity()
, initXdpi);
setScreenSizeDp(activity
, AutoSizeConfig.getInstance().getInitScreenWidthDp()
, AutoSizeConfig.getInstance().getInitScreenHeightDp());
}

/**
* 给 {@link Configuration} 赋值
*
* @param activity {@link Activity}
* @param screenWidthDp {@link Configuration#screenWidthDp}
* @param screenHeightDp {@link Configuration#screenHeightDp}
*/
private static void setScreenSizeDp(Activity activity, int screenWidthDp, int screenHeightDp) {
if (AutoSizeConfig.getInstance().getUnitsManager().isSupportDP() && AutoSizeConfig.getInstance().getUnitsManager().isSupportScreenSizeDP()) {
Configuration activityConfiguration = activity.getResources().getConfiguration();
setScreenSizeDp(activityConfiguration, screenWidthDp, screenHeightDp);

Configuration appConfiguration = AutoSizeConfig.getInstance().getApplication().getResources().getConfiguration();
setScreenSizeDp(appConfiguration, screenWidthDp, screenHeightDp);
}
}

/**
* Configuration赋值
*
* @param configuration {@link Configuration}
* @param screenWidthDp {@link Configuration#screenWidthDp}
* @param screenHeightDp {@link Configuration#screenHeightDp}
*/
private static void setScreenSizeDp(Configuration configuration, int screenWidthDp, int screenHeightDp) {
configuration.screenWidthDp = screenWidthDp;
configuration.screenHeightDp = screenHeightDp;
}

```

是否存在其他方式解决该问题?

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.