Пользовательские шрифты в Android ОК.
Вы сыты на горло пользовательским просмотрам для установки шрифтов? Или переселить ViewTree, чтобы найти текстовые идеи? Да, я тоже.
Включите загрузку зависимости (.aar):
dependencies {
compile ' uk.co.chrisjenx:calligraphy:2.3.0 '
}
Добавьте свои пользовательские шрифты в assets/
. Все определения шрифтов относительно этого пути.
Предполагая, что вы используете Gradle, вы должны создать каталог активов в соответствии с src/main/
в вашем каталоге проекта, если его еще не существует. Поскольку популярно использовать многопроектную сборку с Gradle, путь обычно является app/src/main/assets/
, где app
является названием проекта.
Вы можете рассмотреть возможность создания fonts/
подкаталога в каталоге активов (как в примерах).
< TextView fontPath = " fonts/MyFont.ttf " />
Примечание: пропущенное пространство имен, это намеренное.
Определите свой шрифт по умолчанию, используя CalligraphyConfig
, в вашем классе Application
в методе #onCreate()
.
@ Override
public void onCreate () {
super . onCreate ();
CalligraphyConfig . initDefault ( new CalligraphyConfig . Builder ()
. setDefaultFontPath ( "fonts/Roboto-RobotoRegular.ttf" )
. setFontAttrId ( R . attr . fontPath )
. build ()
);
//....
}
Примечание. Вам не нужно определять CalligraphyConfig
, но библиотека не будет применять шрифт по умолчанию и использовать атрибут по умолчанию R.attr.fontPath
.
Оберните контекст Activity
:
@ Override
protected void attachBaseContext ( Context newBase ) {
super . attachBaseContext ( CalligraphyContextWrapper . wrap ( newBase ));
}
Вы готовы идти!
< TextView
android : text = " @string/hello_world "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
fontPath = " fonts/Roboto-Bold.ttf " />
Примечание: популярная IDE (Android Studio, Intellij), вероятно, отметит это как ошибку, несмотря на то, что он верен. Возможно, вы захотите добавить tools:ignore="MissingPrefix"
либо самому представлению, либо к ее родительской группе просмотра, чтобы избежать этого. Вам нужно добавить пространство имен инструментов, чтобы получить доступ к этому атрибуту «игнорировать». xmlns:tools=" http://schemas.android.com/tools"
. См. Https://code.google.com/p/android/issues/detail?id=65176.
< style name = " TextAppearance.FontPath " parent = " android:TextAppearance " >
<!-- Custom Attr -->
< item name = " fontPath " >fonts/RobotoCondensed-Regular.ttf</ item >
</ style >
< TextView
android : text = " @string/hello_world "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
android : textAppearance = " @style/TextAppearance.FontPath " />
< style name = " TextViewCustomFont " >
< item name = " fontPath " >fonts/RobotoCondensed-Regular.ttf</ item >
</ style >
< style name = " AppTheme " parent = " android:Theme.Holo.Light.DarkActionBar " >
< item name = " android:textViewStyle " >@style/AppTheme.Widget.TextView</ item >
</ style >
< style name = " AppTheme.Widget " />
< style name = " AppTheme.Widget.TextView " parent = " android:Widget.Holo.Light.TextView " >
< item name = " fontPath " >fonts/Roboto-ThinItalic.ttf</ item >
</ style >
CalligraphyFactory
выглядит для шрифта в довольно специфическом порядке, по большей части он очень похож на то, как каркас Android разрешает атрибуты.
View
XML - ATTR, определенная здесь, всегда будет приоритет.Style
XML - ATTR, определенная здесь, проверяется дальше.TextAppearance
XML - ATTR проверяется Далее, единственное предостережение этого - если у вас есть шрифт, определенный в Style
, и TextAttribute
определенный в View
атрибут Style
выбирается в первую очередь!Theme
- если определено, это используется.Default
- если определено в CalligraphyConfig
это используется ни один из вышеперечисленных , или если один из вышеперечисленных возвращает неверный шрифт.Мы изначально сделали, но это противоречило пользователям, желающим фактически использовать этот атрибут, теперь вам нужно определить пользовательский атрибут.
Нам нужно было отправить пользовательский удостоверение личности с каллиграфией, чтобы улучшить поток впрыска шрифта. К сожалению, это означает, что это должно быть aar
. Но вы все равно используете Gradle, верно?
Можно использовать несколько шрифтов внутри TextView
, это не новая концепция для Android.
Это может быть достигнуто, используя что -то вроде следующего кода.
SpannableStringBuilder sBuilder = new SpannableStringBuilder ();
sBuilder . append ( "Hello!" ) // Bold this
. append ( "I use Calligraphy" ); // Default TextView font.
// Create the Typeface you want to apply to certain text
CalligraphyTypefaceSpan typefaceSpan = new CalligraphyTypefaceSpan ( TypefaceUtils . load ( getAssets (), "fonts/Roboto-Bold.ttf" ));
// Apply typeface to the Spannable 0 - 6 "Hello!" This can of course by dynamic.
sBuilder . setSpan ( typefaceSpan , 0 , 6 , Spanned . SPAN_EXCLUSIVE_EXCLUSIVE );
setText ( sBuilder , TextView . BufferType . SPANNABLE );
Конечно, это всего лишь пример. Ваш пробег может варьироваться.
Насколько нам известно (попробуйте: grep -r -e "void set[^(]*(Typeface " <android source dir>
) Есть два стандартных виджета Android, которые имеют несколько методов для установки шрифтов. Они: это:
У обоих есть метод, называемый setSwitchTypeface
, который устанавливает шрифт в переключателе (например, включен/выключен, да/нет). SetTypeface
устанавливает шрифт метки. Вам нужно будет создать свой собственный подкласс, который переопределяет setTypeface
и вызывает super.setTypeface
и super.setSwitchTypeface
.
Эта библиотека была создана, потому что в настоящее время невозможно объявить пользовательский шрифт в файлах XML в Android.
Если вы чувствуете, что это можно сделать, пожалуйста, составьте эту проблему на официальном трекере Android.
Copyright 2013 Christopher Jenkins
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.