在res / values / dimens.xml中为Canvas.drawText()定义文本大小

时间:2014-11-07 16:55:36

标签: android android-resources text-size

在拼字游戏中word game app我试图在黄色瓷砖上绘制黑色字母和值。

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

Mac screenshot

Windows screenshot

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

Real devices

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

<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);

我做错了什么?

4 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

  

public void setTextSize(float size)

     

将默认文本大小设置为给定值,解释为“缩放”   像素“单位。此大小根据电流密度调整   用户字体大小首选项。

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

setTextSize (TypedValue.COMPLEX_UNIT_PX, letterSize)

答案 3 :(得分:1)

除非您想通过缩放图片来手动补偿用户的字体大小设置,否则使用dp作为文字大小绝对是可行的方法。

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

我非常确定我已经看到Android Lint警告过这类内容,请尝试在您的项目中运行它。