tips: 一行代码引入看方式三
方式一
/** * 重写 getResource 方法,防止系统字体影响 */
@Override
public Resources getResources() { //禁止app字体大小跟随系统字体大小调节
Resources resources = super.getResources();
Configuration configuration = new Configuration();
configuration.setToDefaults();
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return resources;
}
或者:
/** * 重写 getResource 方法,防止系统字体影响 */
@Override
public Resources getResources() { //禁止app字体大小跟随系统字体大小调节
Resources resources = super.getResources();
if (resources != null && resources.getConfiguration().fontScale != 1.0f) {
android.content.res.Configuration configuration = resources.getConfiguration();
configuration.fontScale = 1.0f;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
方式二
!!! 以下方法亲测可行,首先是屏蔽系统设置的字体大小:**
1. 在activity和fragment的父类OnCreate()调用
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adjustFontScale( getResources().getConfiguration());
/** * 设置字体大小不被系统设置影响 * @param configuration 字体配置 */
private void adjustFontScale( Configuration configuration) {
// 0.8 为应用内字体缩放比例
configuration.fontScale = (float) 0.8;
DisplayMetrics metrics = getResources().getDisplayMetrics();
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.fontScale * metrics.density;
getBaseContext().getResources().updateConfiguration(configuration, metrics);
}
2. 在AndroidManifest.xml配置
在已注册的activity中添加 ( fontScale ),如:
<!--主要是fontScale属性-->
<activity
android:name=".ui.MainActivity"
android:launchMode="singleTask"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation|fontScale"/>
!!! 接着,是屏蔽系统设置的显示大小:(部分机型的系统设置无该选项则可跳过)**
1. 添加工具类(通过反射获取系统设置api)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1.
adjustFontScale( getResources().getConfiguration());
// 2.
DisplayUtil.setDefaultDisplay(this);
public class DisplayUtil {
/**
* 获取手机出厂时默认的densityDpi
*
* @return
*/
@SuppressLint("PrivateApi")
public static int getDefaultDisplayDensity() {
try {
Class<?> aClass = Class.forName("android.view.WindowManagerGlobal");
Method method = aClass.getMethod("getWindowManagerService");
method.setAccessible(true);
Object iwm = method.invoke(aClass);
Method getInitialDisplayDensity = iwm.getClass().getMethod("getInitialDisplayDensity", int.class);
getInitialDisplayDensity.setAccessible(true);
Object densityDpi = getInitialDisplayDensity.invoke(iwm, Display.DEFAULT_DISPLAY);
return (int) densityDpi;
} catch (Exception e) {
e.printStackTrace();
return 500;
}
}
/**
* 获取手机出厂时默认的densityDpi并设置给手机
* 在需要用到的activity中的onCreate中调用该方法
*
* @param context
*/
public static void setDefaultDisplay(Context context) {
if (Build.VERSION.SDK_INT > 23) {
Configuration origConfig = context.getResources().getConfiguration();
origConfig.densityDpi = getDefaultDisplayDensity();//获取手机出厂时默认的densityDpi
context.getResources().updateConfiguration(origConfig, context.getResources().getDisplayMetrics());
}
}
}
2. 在AndroidManifest.xml配置
在已注册的activity中添加 ( density )
<activity
android:name=".ui.MainActivity"
android:launchMode="singleTask"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation|fontScale|density"/>
方式三
一行代码即可屏蔽系统设置显示大小以及字体大小
- 引入第三方屏幕适配库AndroidAutoSize
implementation me.jessyan:autosize:1.1.2
- 在BaseApplication初始化AndroidAutoSize
主要调用setExcludeFontScale()方法
// 屏幕适配
AutoSizeConfig.getInstance()
.setBaseOnWidth(false) // 是否以宽度作为适配标准
.setExcludeFontScale(true) // 屏蔽显示大小以及字体大小
.setDesignHeightInDp(720); // 设计图高度