Android
Benutzerdefinierte Schriftarten
Suche…
Eine benutzerdefinierte Schriftart in Ihre App einfügen
- Gehe zum (Projektordner)
- Dann app -> src -> main.
- Legen Sie den Ordner 'Assets -> Schriftarten' im Hauptordner an.
- Legen Sie Ihre 'fontfile.ttf' in den fonts-Ordner ab.
Eine Schriftart wird initialisiert
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");
}
Verwenden einer benutzerdefinierten Schriftart in einer TextView
public void setFont(TextView textView) {
textView.setTypeface(myFont);
}
Anwenden von Schrift auf TextView durch XML (nicht erforderlicher Java-Code)
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: (Wo werden res / values platziert )
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TextViewPlus">
<attr name="customFont" format="string"/>
</declare-styleable>
</resources>
Wie benutzt man:
<?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>
Benutzerdefinierte Schriftart im Canvas-Text
Zeichnen von Text in Leinwand mit Ihrer Schriftart aus Assets.
Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/SomeFont.ttf");
Paint textPaint = new Paint();
textPaint.setTypeface(typeface);
canvas.drawText("Your text here", x, y, textPaint);
Effizientes Laden von Schriftarten
Das Laden von benutzerdefinierten Schriftarten kann zu einer schlechten Leistung führen. Ich empfehle dringend, diesen kleinen Helfer zu verwenden, der Ihre bereits verwendeten Schriften in einer Hashtabelle speichert / lädt.
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;
}
}
Verwendungszweck:
Typeface typeface = TypefaceUtils.getTypeface(context, "RobotoSlab-Bold.ttf");
setTypeface(typeface);
Benutzerdefinierte Schriftart für die gesamte Aktivität
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();
}
}
Dann in Ihrer Aktivität in der onCreate()
-Methode:
// Put your font to assets folder...
ReplaceFont.changeDefaultFont(getApplication(), "DEFAULT", "LinLibertine.ttf");
Arbeiten mit Schriftarten in Android O
Android O ändert die Arbeitsweise mit Zeichensätzen.
Mit Android O wird eine neue Funktion namens Fonts in XML eingeführt , mit der Sie Fonts als Ressourcen verwenden können. Dies bedeutet, dass keine Schriften als Assets gebündelt werden müssen. Schriftarten werden jetzt in einer R- Datei kompiliert und stehen automatisch im System als Ressource zur Verfügung.
Um eine neue Schriftart hinzuzufügen, müssen Sie Folgendes tun:
- Erstellen Sie ein neues Ressourcenverzeichnis:
res/font
. - Fügen Sie Ihre Schriftdateien in diesen Ordner ein. Durch das Hinzufügen von
myfont.ttf
können Sie diese Schriftart beispielsweise überR.font.myfont
.
Sie können auch eine eigene Schriftfamilie erstellen, indem Sie die folgende XML-Datei im Verzeichnis res/font
hinzufügen:
<?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>
Sie können sowohl die Schriftartdatei als auch die Schriftartfamiliendatei auf dieselbe Weise verwenden:
Verwenden Sie in einer XML-Datei das Attribut
android:fontFamily
, beispielsweise wieandroid:fontFamily
:<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/myfont"/>
Oder so:
<style name="customfontstyle" parent="@android:style/TextAppearance.Small"> <item name="android:fontFamily">@font/myfont</item> </style>
Verwenden Sie in Ihrem Code die folgenden Codezeilen:
Typeface typeface = getResources().getFont(R.font.myfont); textView.setTypeface(typeface);