Пользовательские шрифты в Android - PullRequest
39 голосов
/ 08 июля 2010

Я уже читал некоторые статьи и искал в Google, но мне не удалось это сделать.

Моя проблема связана с шрифтом.

В Android есть только 4 атрибутав "android:typeface": Normal, Sans, Serif, Monospace.

Итак, что мне нужно сделать, чтобы использовать «Verdana» в моем приложении?

Пожалуйста, предложите мне правильный способ использования этого шрифта в моем приложении для Android.

Ответы [ 7 ]

77 голосов
/ 08 июля 2010

Это простой пример ... создайте папку в корневом каталоге вашего проекта с именем assets/fonts/, затем вставьте файл шрифта TTF (в данном случае Verdana.ttf). Затем, если вы хотите применить этот шрифт, скажем, к TextView, сделайте следующее:

import android.graphics.Typeface;

public class FontSampler extends Activity {
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    TextView tv=(TextView)findViewById(R.id.custom);
    Typeface face=Typeface.createFromAsset(getAssets(),
                                          "fonts/Verdana.ttf");

    tv.setTypeface(face);
  }
}

Этот пример был взят из книги ComonsWare (написанной Марком Мерфи). Вы можете скачать полный пример с GitHub .

4 голосов
/ 07 августа 2013

Вы можете использовать PixlUI на https://github.com/neopixl/PixlUI

, импортировать их .jar и использовать его в XML

 <com.neopixl.pixlui.components.textview.TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    pixlui:typeface="GearedSlab.ttf" />
3 голосов
/ 27 октября 2015

Хорошо !!
Этот вопрос довольно старый, но все же, если кто-то ищет (в 2015 году) ответ о том, как применить собственный шрифт ко всем текстовым представлениям с помощью кода XML, см. Ниже:

Сначала :
нам нужно добавить пользовательский шрифт в папку ресурсов внутри каталога вашего приложения:
.ttf или .otf , оба работают в случаеAndroid

Второй:
Создать класс CustomTextView, расширяющий TextView, как показано ниже:

public class CustomTextView extends TextView {

public CustomTextView(Context context) {
    super(context);
   }

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

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

@Override
public void setTypeface(Typeface tf) {
    super.setTypeface(FontCache.getFont(getContext(),"fonts/<font_name>"));
   }
 }

Третий:
класс FontCacheиспользуется внутри метода setTypeface () в CustomTextView. Цель состоит в том, чтобы выполнить базовое кэширование шрифтов, используя HashMap:

public class FontCache {

private static Map<String,Typeface> fontMap = new HashMap<String,Typeface>();

public static Typeface getFont(Context context,String fontname){
    if(fontMap.containsKey(fontname)){
        return fontMap.get(fontname);
       }
    else{
        Typeface tf = Typeface.createFromAsset(context.getAssets(),fontname);
        fontMap.put(fontname,tf);
        return tf;
      }
    }
}

Четвертый: [Последний шаг] Все, что мы сейчас делаем, это используем CustomTextView непосредственно внутри нашегоXML-файл везде, где требуется текстовое представление пользовательского шрифта:

<<package_name>.CustomTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Custom Font Text"
    android:textSize ="18sp"
    android:textAppearance="?android:textAppearanceSmall"
    android:id="@+id/custom_txt"
   />

Извините, если это уже было опубликовано где-то на SO.Просто подумал поделиться, если кому-то это поможет !!

2 голосов
/ 25 июня 2015

Вы можете использовать простую EasyFonts стороннюю библиотеку для установки различных пользовательских шрифтов на TextView. Используя эту библиотеку, вам не нужно беспокоиться о загрузке и добавлении шрифтов в папку assets / fonts. Также о создании объекта гарнитуры.

Эта библиотека не предоставляет Verdana Font face.

Но предоставьте следующие шрифты. Что бы вы хотели использовать.

  • Roboto
  • Droid Serif
  • Робот-дроид
  • Свобода
  • Fun Raiser
  • Android Nation
  • Зеленый авокадо
  • Признание

Просто:

TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(EasyFonts.robotoThin(this));

Я являюсь автором этой библиотеки.

1 голос
/ 22 апреля 2016

Чтобы изменить (пользовательский) шрифт вашего приложения в глобальном масштабе, взгляните на Каллиграфия

Просто добавьте Каллиграфию в свой gradle.build и добавьте следующий фрагмент в свой Application.onCreate():

CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                        .setDefaultFontPath("fonts/MyCustomFont.ttf")
                        .setFontAttrId(R.attr.fontPath)
                        .build()
        );

и в каждое действие добавьте следующее:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

Это все, что вам нужно сделать, чтобы глобально изменить шрифт в вашем приложении.Посмотрите документы для получения более подробной информации.

0 голосов
/ 09 февраля 2015
TextView textView = (Textview) findViewById(R.id.mytext);
Typeface face=Typeface.createFromAsset(getAssets(),
                                      "fonts/Verdana.ttf");
textView.setTypeFace(face);
0 голосов
/ 06 февраля 2014
// My example show you how to change fonts into a normal textView or list view

create a fonts folder into your assets dir of android and copy your custom font in that ..
assets/fonts/monaco.ttf

// Font path
String fontPath = "fonts/monaco.ttf";

// Loading Font Face
Typeface tf = Typeface.createFromAsset(getAssets(), fontPath);

// CASE 1 : Inside your list view           
holder.name = (TextView) convertView
                .findViewById(R.id.textView_cityName);

// set name of text in each row 
holder.name.setText(CitiesNames.get(position));

// set the type of font you want to set
holder.name.setTypeface(tf);

// CASE 2 : Inside your text view

TextView tx = (TextView)findViewById(R.id.textview1);
tx.setTypeface(tf);

//vKj
...