getDimension()/getDimensionPixelSize() - 乘数问题

2024-02-27

所以我有 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”!但这是为什么呢?官方文档说这些方法 http://developer.android.com/reference/android/content/res/Resources.html#getDimension%28int%29 returns

资源维度值乘以适当的指标。

我通过将值更改为 25 来检查这一点,结果是 38,这意味着 aos 使用 1.5 乘数。但为什么?它已经从适当的文件夹中获取了价值,这意味着它获得了可供使用的价值! aos 从哪里获得 1.5 倍的乘数?我知道这取决于 DisplayMetrics。但 1.5 倍是如何计算的呢?
UPDATE
我了解乘数,但是,你看,这里真正的问题是关于双倍缩放。这就是我问这个问题的原因。
因此,如果我有一些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)。


只是澄清一下(通过检查 Android 源代码获得的信息):

Resources.getDimension() and getDimensionPixelOffset()/getDimensionPixelSize()区别仅在于前者返回float而后两者返回相同的值,四舍五入为int适当地。对于所有这些,返回值均以原始像素为单位。

这三个函数都是通过调用来实现的Resources.getValue()并将由此获得的TypedValue通过致电TypedValue.complexToDimension(), TypedValue.complexToDimensionPixelOffset() and TypedValue.complexToDimensionPixelSize(), 分别。

因此,如果您想要获取“原始”值以及 XML 源中指定的单位,请调用Resources.getValue()并使用以下方法TypedValue class.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getDimension()/getDimensionPixelSize() - 乘数问题 的相关文章

随机推荐