在拼字游戏中word game app我试图在黄色瓷砖上绘制黑色字母和值。
虽然这适用于Windows和Mac下的Android模拟器:
在Moto G,Nexus 1和4等真实设备上,这不起作用(文字大小太大):
我在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);
我做错了什么?
答案 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警告过这类内容,请尝试在您的项目中运行它。