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

非常感谢楼主的分享:

问题: 横屏时 打开一个竖屏使用的弹窗 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;

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值