Android 4.2.1 错误的字距调整(间距)
Posted
技术标签:
【中文标题】Android 4.2.1 错误的字距调整(间距)【英文标题】:Android 4.2.1 wrong character kerning (spacing) 【发布时间】:2012-12-08 02:07:46 【问题描述】:当使用 Canvas
和 drawText()
方法时,我在 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 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);
【讨论】:
以上是关于Android 4.2.1 错误的字距调整(间距)的主要内容,如果未能解决你的问题,请参考以下文章
Firefox 和 Chrome 中 Verdana 的字距调整错误为 15 像素
使用 Swift 调整 UIBarButtonItem 的字距
无法在 UITabBarItem 上启用字母间距(字距调整)
PHP:直接利用 Unicode 字形和 Open Type 字体 (otf) 的字距调整表的优势来创建 PDF 作为服务器响应