Android 4.2.1错误字符字距调整(间距)

Ser*_*m's 10 user-interface android kerning android-4.2-jelly-bean

使用CanvasdrawText()方法时,我在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);
Run Code Online (Sandbox Code Playgroud)

如果我不使用,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 ...

sca*_*ana 14

解决方法,我目前正在使用:

scalePaint.setTextSize(1.5f);
Run Code Online (Sandbox Code Playgroud)

然后,在onDraw方法中:

canvas.save();
canvas.scale(0.01f, 0.01f);
canvas.drawText(""+i, 0.5f*100, 0.8f*100, scalePaint);                  
canvas.restore();
Run Code Online (Sandbox Code Playgroud)

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

  • 说实话,我不是第一个,我已经在其他地方找到了它,我会尽快发布链接到它.由于它是android的bug,我不确定是否会有问题的真正解决方案,而不是愚蠢的解决方法. (2认同)

Ser*_*m's 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)