2012-12-20 28 views
10

CanvasdrawText()の方法を使用すると、Android 4.2.1では別のレンダリングが表示されます。Android 4.2.1不適切な文字のカーニング(間隔)

4.2以下

:アンドロイド4.2.1(Nexux 7)については

enter image description here

私が取得:

enter image description here

テキスト消費は非常にタイトで見ることができるように。 4.2.1で導入されたカーニングの問題と思われます。私はあなたがそこに見ることができるように、私は4.2.1に奇妙な結果を得るtitlePaint.setLinearText(true)を使用しない場合は

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

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

EDITテキストを描画するために使用される塗料は特殊なものではありません:

この奇妙な動作はAndroidチームに報告されました:http://code.google.com/p/android/issues/detail?id=39755しかし、まだ「公式」な問題ではありません。

EDIT(2):

いくつかの噂は問題がTEXTSIZE < 1.0Fであることを主張...

+0

あなたの質問は何ですか? – THelper

+0

なぜAndroid 4.2.1でテキストがレンダリングされるのですか?この不要な動作を修正するにはどうすればよいですか? –

答えて

13

回避策:いくつかの注目を得るためにそこにそれを+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(); 

あなたが見ることができるように、私は、テキストの位置をバック再スケーリングしていますので、それをすることになっていますそれはどこです。

+0

私はあなたのために投票しますあなたはこの素晴らしい問題の回避策を最初に提案しているからです。ありがとうございます(そして、質問に投票してください、誰かがそれを見て、私たちを助けてくれるかもしれません)。 –

+2

正直言って、私は最初ではない、私はそれをどこかに見つけた、私はできるだけ早くそれにリンクを投稿します。 アンドロイドのバグなので、愚かな回避策ではなく、実際の解決策があるかどうかはわかりません。 – scana

+0

私はまだGoogleからの返信を待っています(http://gc.codehum.com/p/android/issues/detail?id=39755)。私はあなたがStackOverflowの最初のここだと思います。それが本当でない場合は、その解決策を見つけたリンクを教えてください! :)そしてはい、あなたは正直です! –

0

これは、Androidのバグであり、それはすでにバグトラッカーあなたに提出している間私は現在使用していることを、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倍を1024倍に置き換えました(もっと深く最適化されることを望みます...) – Couitchy