2016-01-26 7 views
5

Ich zeichne derzeit Text auf Canvas bei Verwendung von externen (nicht standardmäßigen) Schriftart, geladen von TTF-Datei. Ich möchte Kerning für den angezeigten Text aktivieren.So lesen Sie Kerning-Paare Tabelle aus TTF-Datei in Android

Was ich wissen möchte, ist, wenn es eine Möglichkeit gibt, Kerning-Paare aus Schriftart mit Android API zu lesen.

+0

[Diese ältere Frage] (http://stackoverflow.com/q/1640659/2564301) (aber mit Antworten so aktuell wie letztes Jahr) schlagen vor, dass die Kern-Tabellen nicht in Java verfügbar sind. Ist das "manuelle" Parsen der Rohdaten eine praktikable Option? (Beachten Sie, dass es mehrere verschiedene Tabellenformate gibt, alle gleichermaßen grauenhaft ...) – usr2564301

+0

danke, Jongware. Es macht mir nichts aus, * .ttf-Dateien zu analysieren, vorausgesetzt, es gibt einige Informationen darüber, wo nach Kerning-Paaren gesucht werden soll (ich habe normalerweise ein wenig Angst vor schrecklichen Formaten). –

+0

Das wäre in den [OpenType-Spezifikationen] (https://www.microsoft.com/typography/otspec/default.htm), um genau zu sein [Die Kerning-Tabelle] (https://www.microsoft.com/) Typografie/otspec/kern.htm). Bestimmt nicht für schwache Nerven; und wenn du * wirklich * unglücklich bist, ist die Schriftart, die du benutzt hast, ein Type 1 Type und du müsstest die 'GPOS' Untertabelle parsen, was aber immer noch schwieriger ist ... (Dies könnte der Grund sein, warum Programmierer von Canvas ''drawText' stört einfach nicht ...) – usr2564301

Antwort

5

Ich möchte wissen, ob es eine Möglichkeit gibt, Kerning-Paare von Schriftarten mit Android API zu lesen.

Es gibt keine öffentliche API zum Lesen von Kerning-Paaren aus einer TTF-Datei. Allerdings zog ich den entsprechenden Code aus Apache FOP und Sie können die Kerning-Paare mit this library lesen.

Beispiel Nutzung:

TTFFile file = TTFFile.open(getAssets().open("fonts/font.ttf")); 
Map<Integer, Map<Integer, Integer>> kerning = file.getKerning(); 

Sie können auch andere Metadaten abrufen. Beispiel:

TTFFile ttfFile = TTFFile.open(new File("/system/fonts/Roboto-Regular.ttf")); 

String name = ttfFile.getFullName();    // "Roboto Regular" 
String family = ttfFile.getSubFamilyName();  // "Regular" 
int fontWeight = ttfFile.getWeightClass();  // 400 
String copyright = ttfFile.getCopyrightNotice(); // "Font data copyright Google 2014" 

Ich möchte für den Text ermöglichen Kerning ich die Anzeige bin.

See:

How to adjust text kerning in Android TextView?

setLetterSpacing(float)

+0

Danke, ich werde es versuchen und auf Sie zurückkommen. Was die 'setSpacing()' - Methode betrifft, ist sie nicht ganz die gleiche, da der Abstand auf alle Zeichen der Zeichenkette eingestellt ist, während das Kerning nur für bestimmte Zeichenpaare angepasst wird. –

+1

Haben Sie die Bibliothek ausprobiert? Ich kann es bei Bedarf auf maven hochladen. Ich verbrachte ein paar Stunden damit hoffentlich, dass die Zeit für Ihr Projekt nützlich war :-) –

+0

So ...der Schlüssel der ersten Karte ist der Code des ersten Zeichens im Paar? So sollte 'kerning.get (firstChar) 'eine Map aller Character zurückgeben, die mit' firstChar' in einem Paar verbunden sind. Und so sollte 'kerning.get (firstChar) .get (secondChar)' den Offset für das Paar bestehend aus 'firstChar' gefolgt von' secondChar' zurückgeben. Recht? Was bedeutet der tatsächliche Wert? Zum Beispiel "-40". Ist das der Prozentsatz der Breite, um den ich das zweite Zeichen verschieben sollte (im Falle von negativ - nach links)? Bitte erkläre. –

Verwandte Themen