获取字体缩放因子以计算字体大小
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 设备。顺便说一句,我的代码在Activity
的onCreate
回调中。
我也用谷歌搜索了这个问题,发现大约 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 中的窗口大,如何缩放字体大小以适应窗口?
Vanilla JavaScript:调整字体大小以适应容器