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

Posted

技术标签:

【中文标题】Android 4.2.1 错误的字距调整(间距)【英文标题】:Android 4.2.1 wrong character kerning (spacing) 【发布时间】:2012-12-08 02:07:46 【问题描述】:

当使用 CanvasdrawText() 方法时,我在 android 4.2.1 上看到了不同的渲染。

4.2以下:

对于 Android 4.2.1 (Nexux 7) 我得到:

如您所见,文本 Consumption 非常紧凑。似乎是 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

【问题讨论】:

你的问题到底是什么? 为什么文本在 Android 4.2.1 上以这种方式呈现?我能做些什么来解决这种不受欢迎的行为? 【参考方案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();

如您所见,我正在重新调整文本的位置,因此它是应该在的位置。

【讨论】:

我对您的回复投了赞成票,因为您是第一个为这个令人难以置信的问题提出解决方法的人。谢谢(并为这个问题投票,也许其他人会看到它并帮助我们!)。 老实说,我不是第一个,我在别的地方找到了它,我会尽快发布它的链接。由于它是 android 错误,我不确定是否会有真正的解决方案而不是愚蠢的解决方法。 我仍在等待 Google 的回复,您可以在此处看到:gc.codehum.com/p/android/issues/detail?id=39755。我认为您是 *** 上的第一个。如果不是真的,请提供您找到该解决方案的链接! :) 是的,你是诚实的! 最后,我接受你的回答。没有人找到解释这种行为的最终解决方案或官方文档。我不知道这种解决方法会如何影响性能,但我的很多客户都会很高兴......无论如何,谢谢。【参考方案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);
        
    

【讨论】:

我非常喜欢你的回答,我忍不住将 1000 替换为 1024 作为放大镜(希望它在内心深处的某个地方会更加优化......)【参考方案3】:

这是 Android 中的一个错误,虽然它已提交给错误跟踪器,但您可能想在此处 +1 以引起注意:Issue 39755

【讨论】:

是的,我目前正在参与报告。 Android 团队已与我联系,但仍未将其标记为“真实”问题。他们仍在调查...感谢您报告指向 Google 页面的正确链接。你有同样的问题吗? 这是我的另一个问题:***.com/questions/13941270/…【参考方案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 错误的字距调整(间距)的主要内容,如果未能解决你的问题,请参考以下文章

Firefox 和 Chrome 中 Verdana 的字距调整错误为 15 像素

ios:自定义字体的字距调整

使用 Swift 调整 UIBarButtonItem 的字距

无法在 UITabBarItem 上启用字母间距(字距调整)

PHP:直接利用 Unicode 字形和 Open Type 字体 (otf) 的字距调整表的优势来创建 PDF 作为服务器响应

用WORD文档时,如何调整字与字之间的间隙大小