Шрифти для Android

День добрий! У даній статті я хочу обговорити таке важливе питання як шрифти Android. Ми створимо свій TextView з можливістю додавати шрифти в xml і візуально їх відображати у превью. Так само вирішимо одну важливу проблему – використання шрифтів в списку, без глюків і складнощів для братів наших менших, наших Android-пристроїв.

Далі я розпишу як створити папку assets і додавати свої шрифти, так що це можна пропустити.

Створення папки assets і додавання шрифтівПапка assets потрібна для зберігання найрізноманітніших ресурсів в тому числі і шрифтів. Створити її можна вручну в корені main:
\app\src\main\assets
Більш простим способом
image
Далі файли з форматом .ttf закидаємо в assets або в корінь, або створюємо папку fonts, так як assets підтримує вкладеність.

Отже, тепер, власне, звернемося до реалізації використання шрифтів для TextView, в чистому вигляді виглядає приблизно наступним чином:

Typeface type = Typeface.createFromAsset(getAssets(),"fonts/font1.ttf"); 
myTextView.setTypeface(type);

Коли справа стосується більше ніж п'яти TextView, цей процес починає дратувати. А роздратування — це не єдина проблема з якою зустрічається розробник, що використовує дану конструкцію. Справа в тому, що сама обробка файлу шрифту і перетворення його в об'єкт Typeface досить трудомісткий процес, отже, використання подібної конструкції в листі викличе неймовірні глюки.

Дане завдання я пропоную вирішити звичайним сингтоном. І так створюємо щось схоже:


public class SingletonFonts {
private static Typeface font1;
private static Typeface font2;
private static Typeface font3;

public Typeface getFont1() {
return font1;
}

public Typeface getFont2() {
return font2;
}

public Typeface getFont3() {
return font3;
}


public static void setFont1(Typeface font1) {
SingletonFonts.font1 = font1;
}

public static void setFont2(Typeface font2) {
SingletonFonts.font2 = font2;
}

public static void setFont3(Typeface font3) {
SingletonFonts.font3 = font3;
}

private static volatile SingletonFonts instance;

private SingletonFonts() {}

public static SingletonFonts getInstance(Context activity) {
SingletonFonts localInstance = instance;
if (localInstance == null) {
synchronized (SingletonFonts.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new SingletonFonts();
}
}
setFont1(Typeface.createFromAsset(activity.getAssets(), "fonts/font1.ttf"));
setFont2(Typeface.createFromAsset(activity.getAssets(), "fonts/font2.ttf"));
setFont3(Typeface.createFromAsset(activity.getAssets(), "fonts/font3.ttf"));

}
return localInstance;
}


}

І встановлюємо шрифти використовуючи сінглтон, ось так:

public class MainActivity extends AppCompatActivity {
TextView textView1;
TextView textView2;
TextView textView3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.activity_main);
textView1 = (TextView) findViewById(R. id.text_view_1);
textView2 = (TextView) findViewById(R. id.text_view_2);
textView3 = (TextView) findViewById(R. id.text_view_3);

textView1.setTypeface(SingletonFonts.getInstance(this).getFont1());
textView2.setTypeface(SingletonFonts.getInstance(this).getFont2());
textView3.setTypeface(SingletonFonts.getInstance(this).getFont3());

}
}

Використовуючи дану конструкцію ми вирішили другу проблему, з приводу лагів у листі, але не першу, найбільш важливу, вам так само потрібно знаходити всі текстові поля і на все знову і знову сетить шрифти, писати окремі методи і втрачати нервові клітини. Ще одна проблема в тому, що в огляді — стандартний шрифт, отже ширину, висоту свого шрифту. ви можете побачити тільки на живій девайсі або емуляторі, це дуже не зручно.

Зважаючи на вище зазначених проблем ми зараз напишемо свій TextView з блекджеком і шрифтами.

Насамперед створюємо клас спадкоємець звичайного TextView з конструкторами:

public class CustomFontsTextView extends TextView {
public CustomFontsTextView(Context context) {
super(context);
}

public CustomFontsTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CustomFontsTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

public CustomFontsTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}

}

Далі створюємо в папці values файл attrs.xml

Створення attrs.xmlЙдемо ось сюди

image

і створюємо файл з назвою attrs.xml після створення він повинен виглядати приблизно наступним чином:

<?xml version="1.0" encoding="utf-8"?>
<resources>

</resources>


У ньому створюємо наступний блок коду:

//ім'я класу 
<declare-styleable name="CustomFontsTextView">
// перелік всіх ваших шрифтів. name = "fonts" - назва xml атрибута
<attr name="fonts" format="enum">
<enum name="font1" value="0"/>
<enum name="font2" value="1"/>
<enum name="font3" value="2"/>
</attr>
</declare-styleable>

Далі повертаємося в наш клас CustomFontsTextView і пишемо ось такий метод:

public class CustomFontsTextView extends TextView {
public CustomFontsTextView(Context context) {
super(context);
}

public CustomFontsTextView(Context context, AttributeSet attrs) {
super(context, attrs);
setFonts(attrs,context);
}

public CustomFontsTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setFonts(attrs,context);
}

public CustomFontsTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
setFonts(attrs,context);
}


private void setFonts(AttributeSet attributeSet, Context context){
TypedArray a = context.getTheme().obtainStyledAttributes(
attributeSet,
R. styleable.CustomFontsTextView,
0, 0);
int fonts = a.getInt(R. styleable.CustomFontsTextView_fonts,-1);
SingletonFonts singltonFonts = SingletonFonts.getInstance(context);
switch (fonts){
case (0):
setTypeface(singltonFonts.getFont1());
break;
case (1):
setTypeface(singltonFonts.getFont2());
break;
case (2):
setTypeface(singltonFonts.getFont3());
break;
}
}
}

Ось власне і все. Тепер потрібно перебилдить проект, щоб у вас з'явилися кастомні атрибути. Після цього вирушаємо в xml файл нашої актівіті і пишемо:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="library.draw.myapplication.MainActivity">

<library.draw.myapplication.CustomFontsTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="16dp"
app:fonts="font1"
android:textSize="24sp"
android:id="@+id/text_view_1"
android:text="Hello World!" />
<library.draw.myapplication.CustomFontsTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="16dp"
android:textSize="48sp"
app:fonts="font2"
android:id="@+id/text_view_2"
android:text="Hello World!" />
<library.draw.myapplication.CustomFontsTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="16dp"
android:textSize="24sp"
app:fonts="font3"
android:id="@+id/text_view_3"
android:text="Hello World!" />

</LinearLayout>

В огляді ми побачимо вже повністю готові текстові поля з нашими шрифтами.

image
Звертатися до наших кастомным текстових полів краще як до звичайного TextView, по стандартній формі:

TextView textView = (TextView) findViewById(R. id.text_view_1);

Дякую за увагу.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.