获取字体缩放因子以计算字体大小

Posted

技术标签:

【中文标题】获取字体缩放因子以计算字体大小【英文标题】:Get font scaling factor to calculate the fontsize 【发布时间】:2013-05-08 20:05:56 【问题描述】:

这个问题与android App: how to read Font Size under Settings?有关,我看了CommonsWare的答案,指向使用Settings.System.FONT_SCALE。所以我写了这几行:

float scale = -66.6f;
try 
    scale = android.provider.Settings.System.getFloat(getContentResolver(),
                                    android.provider.Settings.System.FONT_SCALE);
 catch(SettingNotFoundException e) 
    Log.e(getClass().getSimpleName(), "Error: ", e);

Toast.makeText(this, "scale=" + scale, Toast.LENGTH_LONG).show();

我的问题是我总是得到SettingNotFoundException 我使用的是Android 4.2.2 设备。顺便说一句,我的代码在ActivityonCreate 回调中。

我也用谷歌搜索了这个问题,发现大约 3 个使用相同代码的网站。是否需要一些特殊许可?我也尝试了权限android.permission.WRITE_SETTINGS,但没有成功。

【问题讨论】:

嗯,我不确定您是否需要阅读此内容。只要你使用sp单位,系统不会为你做缩放吗?? 当然可以,但我有一些图形错误需要使用该比例因子进行修复。 【参考方案1】:

我刚刚在Settings.System的源码中找到了这个函数:

/** @hide */
public static void getConfigurationForUser(ContentResolver cr,
                                       Configuration outConfig, int userHandle) 
    outConfig.fontScale = Settings.System.getFloatForUser(
        cr, FONT_SCALE, outConfig.fontScale, userHandle);
    if (outConfig.fontScale < 0) 
        outConfig.fontScale = 1;
    

但是 FONT_SCALE 正在使用中,所以我检查了文档指向 getResources().getConfiguration()Configuration 类。所以我可以使用以下方法修复我的代码:

float scale = getResources().getConfiguration().fontScale;

因为我的问题是要以像素为单位计算正确的字体大小,所以我现在在 Kotlin 中使用它的方式是:

val Number.dpInPx: Int
    get() = TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, toFloat(), Resources.getSystem().displayMetrics).toInt()

val Number.spInPx: Int
    get() = TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_SP, toFloat(), Resources.getSystem().displayMetrics).toInt()

用法是:

val textSize = 42.spInPx
val padding = 8.dpInPx

【讨论】:

【参考方案2】:

您可以根据字体比例设置系统字体。

示例:对于大字体比例为 2.0 则可以如下设置。

Configuration config = new Configuration();
config.fontScale = 2.0f;
getResources().getConfiguration().setTo(config);

【讨论】:

【参考方案3】:

在末尾添加“float def”参数

public static float getFloat(ContentResolver cr, String name, float def)

例子:

scale = android.provider.Settings.System.getFloat(getActivity().getContentResolver(),
                                    android.provider.Settings.System.FONT_SCALE, 1f);

【讨论】:

【参考方案4】:

你可能会使用getResources().getDisplayMetrics().scaledDensity - http://developer.android.com/reference/android/util/DisplayMetrics.html#scaledDensity

【讨论】:

不,这是一个常数值。在我的设备上总是1.33。在我发现FONT_SCALE之前我试过了。 你有什么设备?猜一个 Nexus 7? 是的,Nexus 7,这是一个已知的错误吗? FontScale 是可用性的用户设置,与硬件无关。

以上是关于获取字体缩放因子以计算字体大小的主要内容,如果未能解决你的问题,请参考以下文章

动态字体大小缩放

如果它比 WPF XAML 中的窗口大,如何缩放字体大小以适应窗口?

Goland 设置 文本编辑器 字体大小缩放快捷键

Vanilla JavaScript:调整字体大小以适应容器

React-Native:如何缩放字体大小以支持 Android 和 iOS 中的许多不同分辨率和屏幕?

设置安卓字体大小,不跟随系统