2012-12-20 30 views
10

Khi sử dụng phương thức CanvasdrawText() Tôi thấy hiển thị khác trên Android 4.2.1.Android 4.2.1 sai ký tự kerning (khoảng cách)

Dưới 4.2:

enter image description here

Đối với Android 4.2.1 (Nexux 7) tôi nhận được:

enter image description here

Như bạn có thể thấy văn bản tiêu thụ là rất chặt chẽ. Dường như là một vấn đề sành điệu được giới thiệu trong 4.2.1. Các sơn dùng để vẽ văn bản là không có gì đặc biệt:

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

Nếu tôi không sử dụng titlePaint.setLinearText(true) tôi nhận được một kết quả lạ trên 4.2.1 như bạn có thể thấy có:

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

EDIT :

Hành vi lạ này đã được báo cáo cho nhóm Android: http://code.google.com/p/android/issues/detail?id=39755 nhưng vẫn không phải là sự cố "chính thức".

EDIT (2):

Một số tin đồn cho rằng vấn đề là một textSize < 1.0f ...

+0

Câu hỏi của bạn chính xác là gì? – THelper

+0

Tại sao văn bản được hiển thị trên Android 4.2.1 theo cách đó? Tôi có thể làm gì để khắc phục hành vi không mong muốn này? –

Trả lời

13

Cách giải quyết, mà tôi hiện đang sử dụng:

scalePaint.setTextSize(1.5f); 

sau đó, trong phương pháp onDraw:

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

Như bạn thấy, tôi rescaling trở lại vị trí của các văn bản, vì vậy nó là nơi mà nó là nghĩa vụ phải được.

+0

Tôi bỏ phiếu cho phản ứng vì bạn là người đầu tiên đề xuất giải pháp cho vấn đề đáng kinh ngạc này. Cảm ơn (và bỏ phiếu cho câu hỏi này, có thể ai đó sẽ nhìn thấy và giúp chúng tôi!). –

+2

Thành thật mà nói, tôi không phải là người đầu tiên, tôi đã tìm thấy nó ở một nơi khác, tôi sẽ đăng liên kết đến nó càng sớm càng tốt. Vì đó là lỗi android, tôi không chắc chắn sẽ có giải pháp thực sự cho vấn đề thay vì giải pháp ngớ ngẩn. – scana

+0

Tôi vẫn đang chờ phản hồi từ Google như bạn có thể thấy ở đây: http://gc.codehum.com/p/android/issues/detail?id=39755. Tôi nghĩ rằng bạn là người đầu tiên ở đây trên StackOverflow. Nếu không đúng, vui lòng cung cấp liên kết nơi bạn tìm thấy giải pháp đó! :) Và vâng, bạn thành thật! –

0

Đây là một lỗi trong Android và trong khi nó đã nộp cho cơ bug tracker bạn có thể muốn +1 nó ở đó để nhận được một số sự chú ý: Issue 39755

+0

Có, tôi hiện đang tham gia vào báo cáo. Tôi đã được nhóm Android liên hệ nhưng vẫn không được đánh dấu là sự cố "thực". Họ vẫn đang điều tra ... Cảm ơn bạn đã báo cáo liên kết chính xác đến trang Google. Bạn có vấn đề tương tự? –

+0

Đây là câu hỏi khác của tôi: http://stackoverflow.com/questions/13941270/android-4-2-on-nexus-7-canvas-drawtext-not-working-correctly/13971632#13971632 –

9

Tôi trả lời câu hỏi của riêng mình sau khi chấp nhận câu trả lời duy nhất đề xuất giải pháp cho vấn đề cụ thể của tôi. Đó có thể là giải pháp "tốt đẹp" và "dứt khoát":

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

Tôi thích câu trả lời của bạn rất nhiều và tôi không thể không thay 1000 1000 cho kính lúp (hy vọng nó sẽ được tối ưu hóa hơn ở đâu đó sâu xuống ...) – Couitchy

Các vấn đề liên quan