【问题标题】:Defining text size for Canvas.drawText() in res/values/dimens.xml在 res/values/dimens.xml 中为 Canvas.drawText() 定义文本大小
【发布时间】:2015-01-29 11:43:20
【问题描述】:

在类似拼字游戏的word game app 中,我正在尝试在黄色瓷砖上绘制黑色字母和值。

虽然这适用于 Windows 和 Mac 下的 Android 模拟器:

这在 Moto G、Nexus 1 和 4 等真实设备上不起作用(文本太大):

我在res/values/dimens.xml中定义了60sp20sp(我也试过dp)的文字大小:

<resources>
    <dimen name="big_tile_letter">60sp</dimen>
    <dimen name="big_tile_value">20sp</dimen>
</resources>

然后在我的BigTile.java 类中使用它们:

    int letterSize = context.getResources().getDimensionPixelSize(R.dimen.big_tile_letter);
    mLetterPaint = new Paint();
    mLetterPaint.setTextSize(letterSize);
    mLetterPaint.setAntiAlias(true);

    Rect letterBounds = new Rect();  
    mLetterPaint.getTextBounds(letter, 0, letter.length(), letterBounds);
    mLetterX = 0.45f * (width - letterBounds.width());
    mLetterY = 0.45f * (height + letterBounds.height());

    canvas.drawText(letter, mLetterX, mLetterY, mLetterPaint);

我做错了什么?

【问题讨论】:

  • 对字母和绘制它的框使用相同的尺寸单位(spdp,等等)。
  • +1 但问题是:瓷砖是png images,字母和值是使用canvas.drawText() 方法绘制的字符串。
  • 要么缩放 PNG 使其与文本大小成比例,要么将文本大小设置为 PNG 大小的比例。
  • 绘制字母时确定画布比例正确吗?

标签: android android-resources text-size


【解决方案1】:

如果您想要将 R.dimen.something 中的值转换为像素,那么:

float textSize = getResources().getDimensionPixelSize(R.dimen.something);

如果您想要提供手动值或类似的东西:

float maxTextSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, maxTextSize, getResources().getDisplayMetrics());

【讨论】:

  • 但是我已经在我的代码中使用getResources().getDimensionPixelSize(R.dimen.something)(请参见上文)。我不明白你的回答有什么帮助
  • 你确定你已经覆盖了所有屏幕 DPI 的所有值吗?
【解决方案2】:

想到的一件事是您正在使用sp 值,这取决于设置/显示/字体大小中的用户设置。您能否检查设置是否类似于Large 左右 - 这将对您的字体大小应用额外的缩放。另外,我相信 2.x 设备的默认设置与 4.x 设备不同(但不确定)。

您可以尝试使用 dp 值,看看是否有任何不同。

【讨论】:

  • 抱歉,刚刚看到您已经尝试过了。请忽略这个答案。
【解决方案3】:

问题在于 setTextSize 获取的是 SP 中的大小值,而不是像素。在您的情况下,getDimensionPixelSize 将 sp 转换为像素,然后 setTextSize 将像素视为 sp,并再次放大。

public void setTextSize(float size)

将默认文本大小设置为给定值,解释为“缩放 像素”单位。这个大小是根据电流密度和 用户字体大小偏好。

要解决此问题,您可以致电

setTextSize (TypedValue.COMPLEX_UNIT_PX, letterSize)

【讨论】:

  • 但是没有 Paint.setTextSize() 接受 2 个参数?
  • 您引用的文档适用于 TextView,而不是 Paint / TextPaint。 Paint.setSize() 使用像素。
【解决方案4】:

使用dp 作为文本大小绝对是这里的最佳选择,除非您还想通过缩放图像来手动补偿用户的字体大小设置。

您的问题是您的big_tile 图像在 mdpi (128x128) 和 xxhdpi (256x256) 变体中的大小不一致:xxhdpi 应该是 mdpi 分辨率的 3 倍,但您的图像只有 2 倍大小,使其有效~85dp 而不是 128dp。

我很确定我已经看到 Android Lint 对这类东西发出警告,请尝试在您的项目上运行它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2017-08-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多