Android
Пользовательские шрифты
Поиск…
Внесение пользовательского шрифта в ваше приложение
- Перейдите в папку (папку проекта)
- Затем app -> src -> main.
- Создать папку 'assets -> fonts' в основной папке.
- Поместите ваш 'fontfile.ttf' в папку шрифтов.
Инициализация шрифта
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");
}
Использование пользовательского шрифта в TextView
public void setFont(TextView textView) {
textView.setTypeface(myFont);
}
Применить шрифт в TextView по xml (не требуется код Java)
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: (Где разместить res / values )
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TextViewPlus">
<attr name="customFont" format="string"/>
</declare-styleable>
</resources>
Как пользоваться:
<?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>
Пользовательский шрифт в тексте холста
Рисование текста в холсте с вашим шрифтом из активов.
Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/SomeFont.ttf");
Paint textPaint = new Paint();
textPaint.setTypeface(typeface);
canvas.drawText("Your text here", x, y, textPaint);
Эффективная загрузка поверхностного слоя
Загрузка пользовательских шрифтов может привести к плохой производительности. Я настоятельно рекомендую использовать этот маленький помощник, который сохраняет / загружает ваши уже используемые шрифты в 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;
}
}
Использование:
Typeface typeface = TypefaceUtils.getTypeface(context, "RobotoSlab-Bold.ttf");
setTypeface(typeface);
Пользовательский шрифт для всей деятельности
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();
}
}
Затем в вашей деятельности, в onCreate()
:
// Put your font to assets folder...
ReplaceFont.changeDefaultFont(getApplication(), "DEFAULT", "LinLibertine.ttf");
Работа с шрифтами в Android O
Android O изменяет способ работы со шрифтами.
Android O представляет новую функцию, называемую Fonts in XML , которая позволяет использовать шрифты в качестве ресурсов. Это означает, что нет необходимости связывать шрифты как активы. Шрифты теперь скомпилированы в R- файле и автоматически доступны в системе как ресурс.
Чтобы добавить новый шрифт , вам необходимо сделать следующее:
- Создайте новый каталог ресурсов:
res/font
. - Добавьте файлы шрифтов в эту папку шрифтов. Например, добавив
myfont.ttf
, вы сможете использовать этот шрифт черезR.font.myfont
.
Вы также можете создать собственное семейство шрифтов , добавив следующий файл XML в каталог 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>
Вы можете использовать как файл шрифта, так и файл семейства шрифтов таким же образом:
В XML-файле, используя атрибут
android:fontFamily
, например, вот так:<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/myfont"/>
Или вот так:
<style name="customfontstyle" parent="@android:style/TextAppearance.Small"> <item name="android:fontFamily">@font/myfont</item> </style>
В вашем коде , используя следующие строки кода:
Typeface typeface = getResources().getFont(R.font.myfont); textView.setTypeface(typeface);