2016-01-26 27 views
5

Attualmente sto disegnando del testo su Canvas mentre uso un font esterno (non standard), caricato dal file TTF. Voglio abilitare il kerning per il testo che sto visualizzando.Come leggere la tabella delle coppie di kerning dal file TTF in Android

Quello che voglio sapere è se c'è la possibilità di leggere le coppie di kerning dal carattere tipografico usando l'API di Android.

+0

[Questo vecchio domanda] (http://stackoverflow.com/q/1640659/2564301) (ma con risposte recente come l'anno scorso) suggeriscono che le tabelle di kern non sono esposte in Java. L'analisi "manuale" dei dati del file non elaborato è un'opzione praticabile? (Notando che ci sono diversi formati di tabella, tutti ugualmente atroci ...) – usr2564301

+0

grazie, Jongware. Non mi preoccupo di analizzare i file * .ttf fornendo che ci sono alcune informazioni su dove cercare le coppie di kerning (di solito ho un po 'paura dei formati atroci). –

+0

Quello sarebbe nelle [specifiche OpenType] (https://www.microsoft.com/typography/otspec/default.htm), per essere precisi in [The Kerning Table] (https://www.microsoft.com/ tipografia/otspec/kern.htm). Sicuramente non per i deboli di cuore; e se sei * veramente * sfortunato, il font che hai usato è di tipo 1 e quindi dovresti analizzare la sottotabella di 'GPOS', che è ancora più difficile ... (Questa potrebbe essere la vera ragione per cui i programmatori di Canvas ''drawText' semplicemente non si sono disturbati ...) – usr2564301

risposta

5

Quello che voglio sapere è se c'è la possibilità di leggere le coppie di kerning dal carattere tipografico usando l'API di Android.

Non ci sono API pubbliche per leggere le coppie di kern da un file TTF. Tuttavia, ho estratto il codice pertinente da Apache FOP e puoi leggere le coppie di kern utilizzando this library.

Esempio di utilizzo:

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

È inoltre possibile recuperare altri metadati. Esempio:

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" 

voglio abilitare la crenatura per il testo che sono la visualizzazione.

See:

How to adjust text kerning in Android TextView?

setLetterSpacing(float)

+0

Grazie, ci provo e torno da te. Per quanto riguarda il metodo 'setSpacing()', non è esattamente lo stesso poiché la spaziatura è impostata su tutti i caratteri della stringa mentre la crenatura viene regolata solo per coppie di caratteri specifici. –

+1

Hai provato la libreria? Posso caricarlo su Maven se necessario/voluto. Ci ho passato un paio d'ore, quindi spero che il tempo sia stato utile per il tuo progetto :-) –

+0

Quindi ...la chiave della prima mappa è il codice del primo carattere nella coppia? Quindi 'kerning.get (firstChar)' dovrebbe restituire una mappa di tutti i charcters associati a 'firstChar' in una coppia. E quindi 'kerning.get (firstChar) .get (secondChar)' dovrebbe restituire l'offset per la coppia che consiste di 'firstChar' seguito da' secondChar'. Destra? Che cosa significa il valore reale? Ad esempio, '-40'. È questa la percentuale di larghezza con cui dovrei spostare il secondo carattere (in caso di negativo - a sinistra)? Spiega per favore. –