所以我有 android 2.3.5 设备,它是 NORMAL/HDPI。我的项目中有一个dimens.xml:
...
<dimen name="gameresult_congrats_label_msg_textSize">20sp</dimen>
...
此文件在 values-normal/values-hdpi 等文件夹中完全相同。在我的第一个活动应用程序中,使用以下方法向我展示了该值:
Toast.makeText(this, "textSize is "+getResources().getDimensionPixelSize(R.dimen.gameresult_congrats_label_msg_textSize), Toast.LENGTH_SHORT).show();
它显示 30。我也试过:
Toast.makeText(this, "textSize is "+getResources().getDimension(R.dimen.gameresult_congrats_label_msg_textSize), Toast.LENGTH_SHORT).show();
但结果是一样的。但只有当我尝试这个时:
Toast.makeText(this, "textSize is "+getResources().getString(R.dimen.gameresult_congrats_label_msg_textSize), Toast.LENGTH_SHORT).show();
我终于得到了我的“20sp”!但这是为什么呢?官方文档说这些方法返回
资源维度值乘以适当的指标。
我通过将值更改为 25 来检查这一点,我得到 38,这意味着 aos 使用 1.5 乘数。但为什么?它已经从适当的文件夹中获得了价值,这意味着它获得了可以使用的价值!aos 从哪里得到 1.5 倍的乘数?我知道这取决于 DisplayMetrics。但它是如何计算 1.5 倍的呢?
更新
我了解乘数,但你看,这里真正的问题是关于双倍缩放。这就是为什么我确实问了这个问题。
因此,如果我有一些 layout.xml(在 res\layout 文件夹中)的 TexView 定义如下:
<TextView
android:id="@+id/congratsLabel"
...
android:textSize="@dimen/gameresult_congrats_label_msg_textSize" />
一切看起来都很好。我的意思是 textview 就像我期待的那样。
现在让我们在代码中做同样的事情:
TextView congratsLabel = fineViewById(R.id.congratsLabel);
textSize = getResources().getDimension(R.dimen.gameresult_congrats_label_msg_textSize)
congratsLabel.setTextSize(textSize)
这是问题!getResources().getDimension() 返回一个SCALED值,没关系。但是我的 textView 的最终大小将比我预期的大 1.5,因为 setTextSize 与 SP 一起使用,第二个比例出现了!这就是 AOS 将生成的文本大小缩放为 45(最初定义为 20sp)的原因。