Suche…


Eine benutzerdefinierte Schriftart in Ihre App einfügen

  1. Gehe zum (Projektordner)
  2. Dann app -> src -> main.
  3. Legen Sie den Ordner 'Assets -> Schriftarten' im Hauptordner an.
  4. 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 über R.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 wie android: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);
    


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow