Android中sp使用问题及字体大小跟随系统设置

Android中sp使用问题及字体大小跟随系统设置

本文目的:使读者快速理解及使用(代码复制可用)

sp的理解


Android开发中,Google建议textSize使用sp单位,那么理解一下sp。

关于px、dp、sp的关系可参考下文
Android中px、dp、sp以及drawable、mip-map目录

sp与px的换算:
1sp= scaledDensity * 1 px
(scaledDensity = context.getResources().getDisplayMetrics().scaledDensity)

一般来说,当用户未更改系统设置的字体大上,系统默认scaledDensity = density,即1sp=1dp

使用sp的优点及带来的问题


优点

当用户调整系统设置字体大小时,app字体大小会跟随改变。
这样对于希望看到更大或更小字体的用户非常友好。相当于提供了字体大小跟随系统字体大小变化的功能。

带来的问题

UI设计一般以标准字体大小来设计,当字体大小变化,与UI设计大小不一致时,可能导致显示丑陋、内容显示不全等问题

什么时候使用sp?

当UI设计时考虑到字体大小变化兼容的情况时,可使用sp
个人经验:目前的设计人员一般不会考虑使用sp时的兼容设计,所以需要sp特性的情况并不多。

字体大小跟随系统设置的代码(可在此基础上为app提供是否跟随系统字体大小的功能设置)


【tip】:app已打开情况下(app打开后进程未杀死),更改系统字体大小,再回到app页面,Activity会执行onDestroy,onCreate生命周期

设置字体大小不跟随系统设置的字体大小代码(复制可用)

/**
 * 修改APP字体
 *
 * @param resource  即context.getResources()
 * @param fontScale  1.0即为标准大小,不随系统缩放
 */
public static void configFontScale(Resources resource, float fontScale) {
    if (resource == null) {
        return;
    }
    try {
        Configuration c = resource.getConfiguration();
        c.fontScale = fontScale; //字体缩放设置为1.0
        resource.updateConfiguration(c, resource.getDisplayMetrics());
    } catch (Exception e) {
        //do what you want
    }
}

代码设置方式

【方式一】在Application中设置
效果:系统字体大小更改后,app打开时,大小不会跟随系统字体大小
存在问题:app已打开情况下(app打开后进程未杀死),更改系统字体大小,再回到app页面,字体会跟随系统字体

public class MyApplication extends Application {

    public static final String MAIN_PROCESS_NAME = "com.tuniu.driver";

    @Override
    public void onCreate() {
        super.onCreate();

        ExtendUtil.configFontScale(getResources(), 1.0f);
    }
}

【方式二】在Activity中设置
效果:系统字体大小更改后,app打开时,大小不会跟随系统字体大小
存在问题:解决方式一的问题

public abstract class BaseActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ExtendUtil.configFontScale(getResources(), 1.0f);
    }
}

代码设置方式一问题原因

app已打开情况下(app打开后进程未杀死),更改系统字体大小,再回到app页面,Activity会执行onDestroy,onCreate生命周期,此时的resource的fontScale是跟随系统的,因此方式一存在问题。

猜你喜欢

转载自my.oschina.net/u/2393003/blog/1825370