7

Tôi đang gặp phải sự cố nghiêm trọng với Ứng dụng của mình, được xuất bản trên Google Play và hoạt động tốt trên tất cả các phiên bản của Android ngoại trừ> 4.0.Android 4.2 trên Nexus 7: canvas.drawText() không hoạt động chính xác

Đây là một screenshoot từ Android 4.0 HTC điện thoại của tôi:

enter image description here

Và đây là những gì tôi nhận được trên Nexus 7, Android 4.2.1 (cùng hành vi trong emulator):

enter image description here

tôi thấy hành vi tương tự cho mỗi văn bản được vẽ bằng canvas.drawText()

Paint sử dụng để vẽ văn bản là:

paint = new Paint(); 
paint.setAntiAlias(true); 
paint.setColor(color); //some color 
paint.setTextSize(size); //some size 
paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); 
paint.setTextAlign(Align.CENTER); 

Trong logcat (4.2.1 giả lập) Tôi nhìn thấy rất nhiều

12-18 20:42:21.096: W/Trace(276): Unexpected value from nativeGetEnabledTags: 0 

tôi sử dụng các thiết lập trong biểu hiện:

<uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="8" /> 
+0

kích thước văn bản thực sự là 0.175f và tôi mở rộng canvas bằng backgroundCanvas.scale (getWidth(), getWidth()); –

Trả lời

14

tôi trả lời câu hỏi của riêng tôi sau khi rất nhiều googling ...

Bí quyết bao gồm trong việc sử dụng setLinearText(true) cho đối tượng Sơn dùng để vẽ các văn bản. Bây giờ, mọi thứ đều tuyệt vời.

paint = new Paint(); 
paint.setAntiAlias(true); 
paint.setColor(color); 
paint.setTextSize(size); 
paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); 
paint.setTextAlign(Align.CENTER); 
paint.setLinearText(true); 

Đây là liên kết mà tiết kiệm ngày của tôi:

http://gc.codehum.com/p/android/issues/detail?id=39755

Tôi hy vọng nó có thể giúp someonelse.

Văn bản không được hiển thị ở tốt nhất được nêu ra:

enter image description here

Edited (14/01/2013)

Tôi vẫn đang phải đối mặt với một vấn đề kering (chỉ trên 4.2. 1). Hãy xem câu hỏi khác của tôi ở đây:

Android 4.2.1 wrong character kerning (spacing)

Edited (05/02/2013)

tôi thấy các dự án khác có cùng một vấn đề.Nhìn vào liên kết dưới đây:

http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/

Nếu bạn chạy các mẫu trên Nexus 4.2.1 (hoặc trong trình giả lập Android 4.2), bạn nhận được cùng một "kỳ lạ" text ...

Edited (20/02/2013)

tìm thấy một workaround mà không sử dụng setLinearText(true), nhìn ở đây:

Android 4.2.1 wrong character kerning (spacing)

+0

Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn! Bạn đã cứu tôi khỏi sự điên rồ! Nó cuối cùng làm việc với setLinearText (true). Tôi muốn họ sẽ ghi lại các thay đổi API này tốt hơn cho các nhà phát triển. Điều đó đã cho tôi 2 tuần để làm việc cho 4.2.1. Grrr .... – ssuperz28

+0

Tôi hạnh phúc Tôi không đơn độc với vấn đề này ... Như bạn có thể thấy, nhân vật kerning có vẻ sai (khoảng cách ký tự là 0). Bạn có vấn đề tương tự? Câu hỏi khác của tôi ở đây: http://stackoverflow.com/questions/13974129/android-4-2-1-worng-character-kerning-spacing –

0

Android 4 mặc định là Tăng tốc phần cứng Bật. Một số chức năng vẽ không hoạt động đúng với tính năng này. Không thể nhớ chính xác cái nào nhưng cố gắng tắt Tăng tốc phần cứng trong tệp kê khai và xem liệu nó có tạo sự khác biệt hay không.

Tất nhiên đây có thể không phải là nguyên nhân nhưng đáng để thử.

+0

Cảm ơn. Unfortunatelly thẻ android: hardwareAccelerated không được nhận diện bên dưới Android 3.0 vì vậy tôi không thể sử dụng nó cho ứng dụng của tôi (Android 2.3.3) ... –

+0

Nếu bạn biên dịch với Android 3 hoặc 4 bạn có thể. Nó sẽ bị bỏ qua trên các phiên bản không hỗ trợ nó. (Thay đổi mục tiêu xây dựng dự án không phải tệp kê khai của bạn) – Kuffs

+0

Ok, tôi đã sử dụng Android SDK 3.2, android: hardwareAccelerated = "false" được biên dịch lại và gặp vấn đề tương tự. –

1

Tôi đã có một vấn đề tương tự, cố gắng để làm cho một cái nhìn với khoảng cách chữ tùy chỉnh vì vậy tôi chỉ cần thực hiện 2 phương pháp này, hy vọng ai đó thấy chúng hữu ích.

/** 
* Draws a text in the canvas with spacing between each letter. 
* Basically what this method does is it split's the given text into individual letters 
* and draws each letter independently using Canvas.drawText with a separation of 
* {@code spacingX} between each letter. 
* @param canvas the canvas where the text will be drawn 
* @param text the text what will be drawn 
* @param left the left position of the text 
* @param top the top position of the text 
* @param paint holds styling information for the text 
* @param spacingPx the number of pixels between each letter that will be drawn 
*/ 
public static void drawSpacedText(Canvas canvas, String text, float left, float top, Paint paint, float spacingPx){ 

    float currentLeft = left; 

    for (int i = 0; i < text.length(); i++) { 
     String c = text.charAt(i)+""; 
     canvas.drawText(c, currentLeft, top, paint); 
     currentLeft += spacingPx; 
     currentLeft += paint.measureText(c); 
    } 
} 

/** 
* returns the width of a text drawn by drawSpacedText 
*/ 
public static float getSpacedTextWidth(Paint paint, String text, float spacingX){ 
    return paint.measureText(text) + spacingX * (text.length() - 1); 
}