10

使用CanvasanddrawText()方法时,我在 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 上得到一个奇怪的结果,如您所见:

Nexus 7 上的 Android 4.2:canvas.drawText() 无法正常工作

编辑:

这种奇怪的行为已报告给 Android 团队:http ://code.google.com/p/android/issues/detail?id=39755但它仍然不是“官方”问题。

编辑(2):

一些谣言声称问题是 textSize < 1.0f ...

4

4 回答 4

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

正如你所看到的,我正在重新调整文本的位置,所以它应该是它应该在的位置。

于 2013-02-12T16:02:52.597 回答
10

在接受为我的具体问题提出解决方法的唯一回复后,我回答了我自己的问题。这可能是一个“不错”和“确定”的解决方案:

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);
        }
    }
于 2013-02-20T20:13:30.427 回答
0

这是 Android 中的一个错误,虽然它已经提交给错误跟踪器,但您可能希望在那里 +1 以引起注意:问题 39755

于 2013-01-03T20:40:07.497 回答
0

使用此功能正确绘制word wrap,new line breaktext 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);
    }
}
于 2018-03-19T08:00:23.777 回答