使用Canvas
和drawText()
方法时,我在Android 4.2.1上看到了不同的呈现。
低于4.2:
对于Android 4.2.1(Nexux 7),我得到:
正如您所看到的,文字消费非常紧张。似乎是4.2.1中引入的字距调整问题。用于绘制文本的Paint并不特别:
titlePaint = new Paint();
titlePaint.setAntiAlias(true);
titlePaint.setColor(0xffffffff);
titlePaint.setTextSize(0.125f);
titlePaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
titlePaint.setTextAlign(Align.CENTER);
titlePaint.setLinearText(true);
如果我不使用titlePaint.setLinearText(true)
,我会在4.2.1上看到一个奇怪的结果,你可以看到:
Android 4.2 on Nexus 7: canvas.drawText() not working correctly
修改
这个奇怪的行为已经报告给Android团队:http://code.google.com/p/android/issues/detail?id=39755但它仍然不是“官方”问题。
编辑(2):
有传言说这个问题是textSize< 1.0F ...
答案 0 :(得分:14)
解决方法,我目前正在使用:
scalePaint.setTextSize(1.5f);
然后,在onDraw方法中:
canvas.save();
canvas.scale(0.01f, 0.01f);
canvas.drawText(""+i, 0.5f*100, 0.8f*100, scalePaint);
canvas.restore();
正如你所看到的,我正在重新调整文本的位置,所以它应该是它的位置。
答案 1 :(得分:9)
在接受针对我的具体问题提出解决方法的唯一回复之后,我回答了我自己的问题。这可能是一个“好”和“权威”的解决方案:
public static void drawTextOnCanvasWithMagnifier(Canvas canvas, String text, float x, float y, Paint paint) {
if (android.os.Build.VERSION.SDK_INT <= 15) {
//draw normally
canvas.drawText(text, x, y, paint);
}
else {
//workaround
float originalTextSize = paint.getTextSize();
final float magnifier = 1000f;
canvas.save();
canvas.scale(1f / magnifier, 1f / magnifier);
paint.setTextSize(originalTextSize * magnifier);
canvas.drawText(text, x * magnifier, y * magnifier, paint);
canvas.restore();
paint.setTextSize(originalTextSize);
}
}
答案 2 :(得分:0)
使用此功能可以使用word wrap
,new line break
和text alignment
功能正确绘制 -
static void drawTextWithStaticLayout(Canvas canvas, float x, float y, String text, int wrapWidth, TextPaint paint,Layout.Alignment alignment) {
if (android.os.Build.VERSION.SDK_INT <= 15) {
StaticLayout sl = new StaticLayout(text,paint, wrapWidth, alignment,1.0f,0.0f,false);
sl.draw(canvas);
}
else {
float originalTextSize = paint.getTextSize();
final float magnifier = 1000f;
canvas.save();
canvas.translate(x,y);
canvas.scale(1f / magnifier, 1f / magnifier);
paint.setTextSize(originalTextSize * magnifier);
StaticLayout sl = new StaticLayout(text,paint, (int)magnifier*wrapWidth, alignment,1.0f,0.0f,false);
sl.draw(canvas);
canvas.restore();
paint.setTextSize(originalTextSize);
}
}