2012-12-20 50 views
10

當使用CanvasdrawText()方法時,我在Android 4.2.1上看到了不同的呈現。Android 4.2.1錯誤字符字距(間距)

低於4.2:

enter image description here

如果是Android 4.2.1(Nexux 7)我得到:

enter image description here

正如你可以看到文本消費非常緊張。似乎是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一個奇怪的結果,你可以看到有我不使用:

Android 4.2 on Nexus 7: canvas.drawText() not working correctly

編輯:

這種奇怪的行爲已經被上報Android團隊:http://code.google.com/p/android/issues/detail?id=39755,但它仍然不是一個「官方」的問題。

EDIT(2):

一些傳言聲稱,問題是TEXTSIZE < 1.0F ...

+0

你的問題到底是什麼? – THelper

+0

爲什麼在Android 4.2.1上以這種方式呈現文本?我能做些什麼來解決這種不需要的行爲? –

回答

13

解決方法,我目前使用:

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

正如你所看到的,我重新調整迴文本的位置,所以這就是它應該是。

+0

我投票贊成你的因爲你是第一個提出這個令人難以置信的問題的解決方法。謝謝(併爲這個問題投票,也許別人會看到它並幫助我們!)。 –

+2

說實話,我不是第一個,我找到了其他地方,我會盡快發佈鏈接。 既然是android bug,我不確定會有真正的問題解決方案,而不是愚蠢的解決方法。 – scana

+0

我還在等待Google的回覆,如下所示:http://gc.codehum.com/p/android/issues/detail?id=39755。我認爲你是StackOverflow中的第一個。如果不是這樣,請給出你找到解決方案的鏈接! :)是的,你是誠實的! –

0

這是一個錯誤在Android和,而它已經提交bug跟蹤你可能希望有+1按鈕得到一些注意事項:Issue 39755

+0

是的,我目前正在參與報告。我已與Android團隊聯繫過,但它仍未標記爲「真正」問題。他們仍在調查......感謝您報告Google頁面的正確鏈接。你有同樣的問題嗎? –

+0

這是我的另一個問題:http://stackoverflow.com/questions/13941270/android-4-2-on-nexus-7-canvas-drawtext-not-working-correctly/13971632#13971632 –

9

在接受針對我的特定問題提出解決方法的唯一回復後,我回答我自己的問題。這可能是一個「好的」和「明確的」解決方案:

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

我非常喜歡你的答案,我忍不住用1000放大鏡取代了1000(希望它會在更深的地方更加優化......) – Couitchy