在Android应用开发过程中,一定会碰到本来完美的布局,在系统字体大小设置【最大】时变成一团浆糊。解决办法网上也有很多,但是分析原理的却几乎没看到。博主在碰到问题的第一时间也是直接用了网上的方法,即在BaseActivity中重写getResources方法如下

@Override

public Resources getResources() {

Resources res = super.getResources();

Configuration config=new Configuration();

config.setToDefaults();

res.updateConfiguration(config,res.getDisplayMetrics());

return res;

}

这个方法是有效的。

但是作为开发人员必须懂得举一反三,而要举一反三就必须要“知其所以然”,于是博主就去探寻了一番,才有了此篇文章。

1.字体大小如何设置

这个简单,就拿TextView来说,设置字体大小调用setTextSize方法就行了。如果你直接以px为单位设置字体大小,那么应用字体大小是绝对不会被系统字体所影响的,但是绝大多数时候,我们用的单位都是sp,sp是什么?sp = scaled pixel 即缩放了的像素值。而如果用了sp就一定会受系统字体大小的影响。

我们拿TextView来举例,看看它的setTextSize方法

public void setTextSize(int unit, float size) {

Context c = getContext();

Resources r;

if (c == null)

r = Resources.getSystem();

else

r = c.getResources();

setRawTextSize(TypedValue.applyDimension(

unit, size, r.getDisplayMetrics()));

}

看一眼代码,至少可以确定一件事情:设置的字体大小在内部做了计算和变换。

没错,就是这个applyDimension方法干的好事!!

我们跟进去看看先:

public static float applyDimension(int unit, float value,

DisplayMetrics metrics)

{

switch (unit) {

case COMPLEX_UNIT_PX:

return value;

case COMPLEX_UNIT_DIP:

return value * metrics.density;

case COMPLEX_UNIT_SP://看这里,看这里

return value * metrics.scaledDensity;

case COMPLEX_UNIT_PT:

return value * metrics.xdpi * (1.0f/72);

case COMPLEX_UNIT_IN:

return value * metrics.xdpi;

case COMPLEX_UNIT_MM:

return value * metrics.xdpi * (1.0f/25.4f);

}

return 0;

}

事实一目了然,我们设置进去的value值,这个方法返回的是value*metrics.scaledDensity 问题肯定出在scaledDensity这个属性身上!!!

好了,字体大小的设置到此结束。

2. scaledDensity真面目

根据网上提供的办法,我们知道字体大小的影响跟Resources有关(具体原因待分析)。于是博主在Resources.java源码中进行了查找,发现了一个重要的方法

public void updateConfiguration(Configuration config,

DisplayMetrics metrics) {

updateConfiguration(config, metrics, null);

}

然后是具体实现的方法:

public void updateConfiguration(Configuration config,

DisplayMetrics metrics, CompatibilityInfo compat) {

synchronized (mAccessLock) {

... 省略代码 ...

mMetrics.scaledDensity = mMetrics.density * mConfiguration.fontScale;

... 省略代码 ...

}

synchronized (sSync) {

if (mPluralRule != null) {

mPluralRule = NativePluralRules.forLocale(config.locale);

}

}

}

相信大家都看到了,mMetrics.scaledDensity的值其实是受mConfiguration.fontScale影响的。那么我们的研究对象又一次转变了,变成了fontScale。

此时,我们对照一下,网上的解决系统字体大小影响的代码片段

@Override

public Resources getResources() {

Resources res = super.getResources();

Configuration config=new Configuration();

config.setToDefaults();

res.updateConfiguration(config,res.getDisplayMetrics());

return res;

}

看来路子是走对了,这里也是对Configuration进行了设置,并且还调用了updateConfiguration方法。

并且我还告诉你,这里的config.setToDefaults()方法内部第一句代码就是fontScale=1。

那么分析到这里,我们基本可以推测:如果修改系统的字体大小,fontScale肯定会改变!

3. 最终解决

首先,推测是需要验证的。我们可以编写一个demo,在MainActivity的onCreate方法中打印fontScale值

Log.d("Javine","fontScale = "+getResources().getConfiguration().fontScale);

博主的是锤子T1,打印出来的结果是

标准 —– fontScale = 1.0

较大 —– fontScale = 1.1

最大 —– fontScale = 1.4

到此为止,我们还是不能百分之百确定问题一定是因为fontScale值的变化引起的。

我们还需要做最后一件事情——通过修改fontScale值来修复字体大小的问题!

跟网上的解决办法一样,重载Activity的getResources方法如下:

@Override

public Resources getResources() {

//获取到resources对象

Resources res = super.getResources();

//修改configuration的fontScale属性

res.getConfiguration().fontScale = 1;

//将修改后的值更新到metrics.scaledDensity属性上

res.updateConfiguration(null,null);

return res;

}

经博主测试,问题完美解决!!并且,对比网上的解决办法,我们并没有新建一个Configuration对象,从性能角度上说,这个办法更优。

android改变整个app字体大小,Android系统字体大小如何影响app的字体大小?相关推荐

  1. linux 增加shm 大小,Linux系统中如何修改及限制shm的大小

    在天下网吧-网吧系统-网吧天下栏目上一篇文章中,我们看到了:希望对各位网吧网管或者网吧维护,做网吧系统的各位大大有用,那么今天我们一起来看下:Linux系统中如何修改及限制shm的大小 前面的一篇文章 ...

  2. Android改变移动网络ip地址,Android之获取移动网络ip

    1.获取移动网络ip 2.代码 public String getLocalIpAddress() { try { for (Enumeration en = NetworkInterface.get ...

  3. android在线预览excel文件格式,Android打开doc、xlsx、ppt等office文档解决方案

    原标题:Android打开doc.xlsx.ppt等office文档解决方案 1.Android端有什么控件可以直接显示office文档吗? 很抱歉没有,对于ios而言想要显示office文档,直接调 ...

  4. linux中jdk添加字体_在Linux上为Openjdk Java定义/安装字体的位置

    在Ubuntu上安装了Oracle 8 jdk,在jre/lib中它具有各种fontProperties文件和一个包含字体的字体目录.但是,当安装OpenJdk 8时,jre/lib中的字体文件上没有 ...

  5. android改变整个app字体大小,Android APP字体随系统字体调整造成界面布局混乱问题解决方案...

    一.遇到的问题: 当用户调整系统字体大小的时候,APP的字体一般也都会跟随改变,进而导致某些界面布局排版混乱. 下面先说一下关于sp单位的理解 sp单位除了受屏幕密度影响外,还受到用户的字体大小影响, ...

  6. Android禁止app字体大小跟随系统字体大小调节

    Android禁止app字体大小跟随系统字体大小调节 针对字体不随系统应用改变而改变,不然会导致原来的一些布局变化,在Application中重写getResources() @Overridepub ...

  7. 如何设置app字体跟随系统_设置Android app的字体不随系统全局字体大小的变动而变动...

    从android4.0起系统设置的"显示"提供设置字体大小的选项.以三星s4为例,在"设置-我的设备-显示-字体大小"中选择,可以调整系统的字体.这个设置直接会 ...

  8. android程序字体大小,Android APP字体大小,不随系统的字体大小变化而变化的方法...

    今天在工作中遇到了UI上的字体跟随系统的变化,导致整体变样了,所以就想了让APP不随系统字体变化,网上查了一下,了解从android4.0起系统设置的"显示"提供设置字体大小的选项 ...

  9. android 7.1 字体更换,Android APP字体随系统字体调整造成界面布局混乱问题解决方案...

    一.遇到的问题: 当用户调整系统字体大小的时候,APP的字体一般也都会跟随改变,进而导致某些界面布局排版混乱. 下面先说一下关于sp单位的理解 sp单位除了受屏幕密度影响外,还受到用户的字体大小影响, ...

  10. Android通知栏字体大小,Android通知栏介绍与适配总结(上篇)

    此文已由作者黎星授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知 ...

最新文章

  1. MIT提出Liquid机器学习系统,可像液体一样适应动态变化
  2. 【OJ】OJ的介绍和常用OJ推荐
  3. 网络分层模型OSI和TCP/IP四层模型
  4. AAAI2020录用论文汇总(三)
  5. python——函数 10、函数的嵌套
  6. vue 简介 vue 项目
  7. 苹果公司透露Siri新发音引擎的内部原理
  8. 移动端 项目开发经验集锦
  9. MySQL Router 测试使用 转
  10. JAVA给图片添加水印,java初级面试笔试题
  11. C语言 FileStreaming(文件流)
  12. java打印条形码Code128C
  13. 【webi 专题】能否通过传参数动态生成二维图表?
  14. (2016弱校联盟十一专场10.2) E.Coins
  15. vpx计算机论文,vpx总线
  16. Word,Excel联动结合邮件合并功能实现批量打印员工个人信息表桌牌奖状出试卷
  17. 连续变量的描述统计与SPSS实现
  18. Java携带HTTP头信息下载网络图片
  19. 《哔哩哔哩助手》助你快速成为B站老司机
  20. 我用python写了一套股票万金油,回报小雪下面给我吃

热门文章

  1. 科技大势怎么看 2023怎么干?
  2. php7 一句话木马,PHP一句话木马后门
  3. 2022年度游戏本行业数据报告:十大热门品牌销量排行榜
  4. 10个最受欢迎的wordpress多用创意途主题
  5. 从零到一手写迷你版Vue
  6. 网游太卡,试试代理IP加速游戏
  7. 猴子选大王(约瑟环问题)
  8. 支付宝免手续费免签即时到账接口实现方案和演示demo下载
  9. Android定时器Timer简单使用
  10. OSChina 周一乱弹 —— 等安好机械臂 再拒绝你的表白 人类