安卓4.2.1错误字符字距(间距)(Android 4.2.1 wrong character ke

2019-07-17 10:54发布

当使用CanvasdrawText()方法我看到在Android 4.2.1不同的渲染。

低于4.2:

为Android 4.2.1(Nexux 7)我得到:

正如你可以看到文本消费是非常紧张。 似乎是在4.2.1引入了字距问题。 用于绘制文本的涂料是没有什么特别的:

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一个奇怪的结果,你可以看到有:

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

编辑:

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

EDIT(2):

一些传言声称,问题是TEXTSIZE <1.0F ...

Answer 1:

解决方法,我目前使用:

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

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



Answer 2:

我的回答是接受建议我的具体问题的解决方法唯一的反应后我自己的问题。 这可能是一个“好”和“权威”的解决方案:

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


Answer 3:

这是Android的一个bug,虽然它已经提交bug跟踪系统,你可能想有+1按钮得到一些注意事项: 发行39755



Answer 4:

使用此功能与正确绘制word wrapnew 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);
    }
}


文章来源: Android 4.2.1 wrong character kerning (spacing)