Android
Caratteri personalizzati
Ricerca…
Inserire un carattere personalizzato nella tua app
- Vai alla (cartella del progetto)
- Quindi app -> src -> main.
- Crea cartella 'assets -> fonts' nella cartella principale.
- Metti il tuo 'fontfile.ttf' nella cartella dei caratteri.
Inizializzazione di un font
private Typeface myFont;
// A good practice might be to call this in onCreate() of a custom
// Application class and pass 'this' as Context. Your font will be ready to use
// as long as your app lives
public void initFont(Context context) {
myFont = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Light.ttf");
}
Utilizzando un carattere personalizzato in un TextView
public void setFont(TextView textView) {
textView.setTypeface(myFont);
}
Applicare font su TextView da xml (codice Java non richiesto)
TextViewPlus.java:
public class TextViewPlus extends TextView {
private static final String TAG = "TextView";
public TextViewPlus(Context context) {
super(context);
}
public TextViewPlus(Context context, AttributeSet attrs) {
super(context, attrs);
setCustomFont(context, attrs);
}
public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setCustomFont(context, attrs);
}
private void setCustomFont(Context ctx, AttributeSet attrs) {
TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
String customFont = a.getString(R.styleable.TextViewPlus_customFont);
setCustomFont(ctx, customFont);
a.recycle();
}
public boolean setCustomFont(Context ctx, String asset) {
Typeface typeface = null;
try {
typeface = Typeface.createFromAsset(ctx.getAssets(), asset);
} catch (Exception e) {
Log.e(TAG, "Unable to load typeface: "+e.getMessage());
return false;
}
setTypeface(typeface);
return true;
}
}
attrs.xml: (Dove posizionare res / valori )
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TextViewPlus">
<attr name="customFont" format="string"/>
</declare-styleable>
</resources>
Come usare:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:foo="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.mypackage.TextViewPlus
android:id="@+id/textViewPlus1"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:text="@string/showingOffTheNewTypeface"
foo:customFont="my_font_name_regular.otf">
</com.mypackage.TextViewPlus>
</LinearLayout>
Carattere personalizzato nel testo della tela
Disegna il testo su tela con il tuo font dalle risorse.
Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/SomeFont.ttf");
Paint textPaint = new Paint();
textPaint.setTypeface(typeface);
canvas.drawText("Your text here", x, y, textPaint);
Caricamento del carattere tipografico efficiente
Il caricamento di caratteri personalizzati può comportare un cattivo rendimento. Consiglio vivamente di utilizzare questo piccolo helper che salva / carica i font già utilizzati in un Hashtable.
public class TypefaceUtils {
private static final Hashtable<String, Typeface> sTypeFaces = new Hashtable<>();
/**
* Get typeface by filename from assets main directory
*
* @param context
* @param fileName the name of the font file in the asset main directory
* @return
*/
public static Typeface getTypeFace(final Context context, final String fileName) {
Typeface tempTypeface = sTypeFaces.get(fileName);
if (tempTypeface == null) {
tempTypeface = Typeface.createFromAsset(context.getAssets(), fileName);
sTypeFaces.put(fileName, tempTypeface);
}
return tempTypeface;
}
}
Uso:
Typeface typeface = TypefaceUtils.getTypeface(context, "RobotoSlab-Bold.ttf");
setTypeface(typeface);
Carattere personalizzato per l'intera attività
public class ReplaceFont {
public static void changeDefaultFont(Context context, String oldFont, String assetsFont) {
Typeface typeface = Typeface.createFromAsset(context.getAssets(), assetsFont);
replaceFont(oldFont, typeface);
}
private static void replaceFont(String oldFont, Typeface typeface) {
try {
Field myField = Typeface.class.getDeclaredField(oldFont);
myField.setAccessible(true);
myField.set(null, typeface);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
Quindi nella tua attività, nel metodo onCreate() :
// Put your font to assets folder...
ReplaceFont.changeDefaultFont(getApplication(), "DEFAULT", "LinLibertine.ttf");
Lavorare con i caratteri in Android O
Android O cambia il modo di lavorare con i caratteri.
Android O introduce una nuova funzionalità, chiamata Fonts in XML , che consente di utilizzare i caratteri come risorse. Ciò significa che non è necessario raggruppare i font come risorse. I caratteri sono ora compilati in un file R e sono automaticamente disponibili nel sistema come una risorsa.
Per aggiungere un nuovo font , devi fare quanto segue:
- Crea una nuova directory di risorse:
res/font. - Aggiungi i tuoi file di font in questa cartella di font. Ad esempio, aggiungendo
myfont.ttf, sarà possibile utilizzare questo carattere tramiteR.font.myfont.
Puoi anche creare la tua famiglia di caratteri aggiungendo il seguente file XML nella directory res/font :
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
android:fontStyle="normal"
android:fontWeight="400"
android:font="@font/lobster_regular" />
<font
android:fontStyle="italic"
android:fontWeight="400"
android:font="@font/lobster_italic" />
</font-family>
È possibile utilizzare sia il file di font e il file famiglia di font nello stesso modo:
In un file XML, utilizzando l'attributo
android:fontFamily, ad esempio in questo modo:<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/myfont"/>O in questo modo:
<style name="customfontstyle" parent="@android:style/TextAppearance.Small"> <item name="android:fontFamily">@font/myfont</item> </style>Nel codice , utilizzando le seguenti righe di codice:
Typeface typeface = getResources().getFont(R.font.myfont); textView.setTypeface(typeface);