仿微信调整APP文本大小
今日要实现类型微信,qq的文本大小调整,不随系统变化,目前网上主要方案有:
1、设置fontScale
2、设置densityDpi
3、设置theme
观察微信调整文本大小时,头像等元素也随着变化,因此排除fontScale模式,设置theme模式需要修改的代码太多,也不适用,排除,因此选择方案2
具体实现如下:
Activity基类中添加:
@Override
public Resources getResources() {
Resources resources = super.getResources();
return DisplayUtils.getResources(this, resources);
}
//主要用于解决fragment中不跟随变化的我那天
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(getAttachBaseContext(newBase));
}
protected Context getAttachBaseContext(Context newBase) {
return DisplayUtils.attachBaseContext(newBase);
}
DisplayUtils代码
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.util.Log;
import android.view.Display;
import com.sogou.xiaop_android.business.model.dao.entity.KeyValuePair;
import java.lang.reflect.Method;
public class DisplayUtils {
public static float fontScale = -1f;
public static float sysScale = 1f;
public static float usedScale;
private static int sysDpi;
private static int defaultDpi;
private static float dpiScale;
private static int usedDpi;
private static void initFontScale(Configuration configuration) {
if (fontScale == -1) {
fontScale = XiaopSharedPreferencesHelper.getFontScaleSize(1.0f);
sysScale = configuration.fontScale;
defaultConfigurationDpi = configuration.densityDpi;
if (sysScale == 0) {
sysScale = 1f;
}
}
//实时获取系统dpi,防止修改分辨率后,app进程没有重启导致显示异常
try {
defaultDpi = ViewUtils.getDisplayMetrics().densityDpi;
Log.i("DisplayUtils", "ViewUtils.getDisplayMetrics().densityDpi " + defaultDpi);
} catch (Exception e) {
e.printStackTrace();
}
if (defaultDpi <= 0) {
defaultDpi = defaultConfigurationDpi;
}
if (fontScale == 1f) {
if (sysScale != 1f) {
usedScale = fontScale + (sysScale - 1f) / 4;
} else {
usedScale = 1f;
}
} else {
usedScale = fontScale;
}
usedDpi = (int) (defaultDpi * usedScale);
Log.i("DisplayUtils", "initFontScale usedDpi " + usedDpi + ",defaultDpi " + defaultDpi + ",fontScale=" + fontScale + ",usedScale=" + usedScale + ",sysScale=" + sysScale);
}
/**
* 保持字体大小不随系统设置变化(用在界面加载之前)
* 要重写Activity的attachBaseContext()
*/
public static Context attachBaseContext(Context context) {
Configuration config = context.getResources().getConfiguration();
initFontScale(config);
if (usedDpi > 0) {
config.fontScale = 1f;
config.densityDpi = usedDpi;
} else {
config.fontScale = usedScale;
}
return context.createConfigurationContext(config);
}
/**
* 保持字体大小不随系统设置变化(用在界面加载之前)
* 要重写Activity的getResources()
*/
public static Resources getResources(Context context, Resources resources) {
Configuration config = resources.getConfiguration();
initFontScale(config);
if ((usedDpi > 0 && (config.densityDpi != usedDpi || config.fontScale != 1f)) || (config.fontScale != usedScale)) {
if (usedDpi > 0) {
config.fontScale = 1f;
config.densityDpi = usedDpi;
} else {
config.fontScale = usedScale;
}
return context.createConfigurationContext(config).getResources();
} else {
return resources;
}
}
}
设置完成字体后重启APP刷新:
Intent intent = new Intent();
intent.setClass(AppEnvVars.appContext, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK| Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
Activity curActivity = AppEnvVars.getCurrentActivity();
(curActivity == null ? AppEnvVars.appContext : curActivity).startActivity(intent);