2012-06-08 13 views
29

Używam niestandardowej czcionki .ttf w mojej aplikacji na Androida. I załadować go w zwykły sposób:Niestandardowa czcionka w Androidzie renderuje się inaczej w różnych interfejsach API

myTypeface = Typeface.createFromAsset(getAssets(), "myTypeface.ttf"); 

następnie przypisać mój krój ciągu mojej działalności ... całkiem proste rzeczy:

TextView tv = (TextView) findViewById(R.id.sample_text); 
tv.setTextSize(12); 
tv.setTypeface(App.myTypeface); 

Problem używam do jest to, że na niektórych urządzeniach z wykorzystaniem później Interfejsy API (szczególnie zauważyłem to w emulatorze dla Transformatora Asusa), tekst wygląda nieco odważniej, mniej jednolicie na szerokość i bardziej pomieszany w pionowym układzie. Przez tę ostatnią część mam na myśli to, że niektóre postacie są umieszczone pionowo wyżej lub niżej niż inne, co nadaje tekstowi trochę wrażenia z rolki.

Rozważmy zrzuty ekranu poniżej

To jest tekst wydanego na emulatorze z taką samą rozdzielczością i DPI jako transformator, ale przy użyciu API Google poziom 8.

i45.tinypic.com/142toud.png

wygląda dość standardowy, dobrze?

Teraz rozważmy tekst świadczonych w emulatorze z taką samą rozdzielczością i DPI, ale przy użyciu poziom API Google 15:

i47.tinypic.com/24zhekn.png

W pierwszym tekście mogą wyglądać podobnie, choć można zauważyć, wydaje się nieco odważniejsze. Jednak spójrz na "c" w "szybki". Zauważysz, że znajduje się niżej i jest wyższy niż "c" w pierwszym renderowaniu. Zauważysz również, że jeśli spojrzysz na dno znaków w słowie "szybkie", nie są wyrównane na dole.

Te kwestie mogą wydawać się niewielkie, ale na ekranach z dużą ilością tekstu, to zaczyna wyglądać bardzo nieprofesjonalne.

Ktoś to widział, czy ma jakieś wyjaśnienie? Chciałbym, aby tekst wyglądał jednolicie w późniejszych interfejsach API.

Dziękuję bardzo za poświęcony czas!

+0

Zdecydowanie różne renderowanie czcionek. Może być wygładzanie, podpowiedź wyłączona. Czy możesz zobaczyć, jaka wartość dla 'textView.getPaintFlags()' zwraca zarówno dla poziomu API 8 i poziomu interfejsu API 15 i edytować go? (@ mnie, więc dostaję powiadomienie i przyjrzę się) – kcoppock

+0

@kcoppock Dzięki za odpowiedź. getPaintFlags() zwraca 257 dla obu interfejsów API. –

+0

To wygląda podobnie, a może duplikat http://stackoverflow.com/questions/9036184/custom-font-rendering-on-android-4-0-ice-cream-sandwich. Nigdy nie otrzymałem prawdziwej odpowiedzi. – HandlerExploit

Odpowiedz

58

Ok, więc wydaje się, że tylko następujące flagi stosowane w obu przypadkach:

Paint.DEV_KERN_TEXT_FLAG 
Paint.ANTI_ALIAS_FLAG 

spróbować zrobić to, i sprawdzić, czy wyniki są inaczej (niekoniecznie lepsze, ale nawet zauważalny w ogóle) :

textView.setPaintFlags(textView.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); 
+1

Ogromna różnica! Tekst rzeczywiście wygląda poprawnie! Dziękuję bardzo za wkład. Oto strzał z dwóch emulatorów teraz, Transformer po lewej:! [Nowe renderowanie tekstu] (http://i49.tinypic.com/nwzzaw.png) –

+0

To świetnie! Myślałem, że to może załatwić sprawę. Powiedziałbym, że domyślnie wyłączali to w nowszym API, ale otrzymywaliście te same wartości flag ... Nie jestem pewien DLACZEGO dokładnie to działa, ale cieszę się, że tak. :) Jeśli uważasz, że to wszystko, czego potrzebujesz, możesz oznaczyć to pytanie jako odpowiedź. – kcoppock

+0

Oznaczyłem to jako Odpowiedziałem. Dzięki! –

Powiązane problemy