Fonts personnalisés dans Android d'une manière ok.
Avez-vous marre des vues personnalisées pour définir des polices? Ou traverser le ViewTree pour trouver TextViews? Ouais moi aussi.
Inclure le téléchargement de dépendance (.aar):
dependencies {
compile ' uk.co.chrisjenx:calligraphy:2.3.0 '
}
Ajoutez vos polices personnalisées aux assets/
. Toutes les définitions de police sont relatives à ce chemin.
En supposant que vous utilisez Gradle, vous devez créer le répertoire des actifs sous src/main/
dans votre répertoire de projet s'il n'existe pas déjà. Comme il est populaire d'utiliser la construction multi-projets avec Gradle, le chemin est généralement app/src/main/assets/
, où app
est le nom du projet.
Vous pourriez envisager de créer des fonts/
sous-répertoires dans le répertoire des actifs (comme dans les exemples).
< TextView fontPath = " fonts/MyFont.ttf " />
Remarque: l'espace de noms manquant, c'est intentionnel.
Définissez votre police par défaut à l'aide de CalligraphyConfig
, dans votre classe Application
dans la méthode #onCreate()
.
@ Override
public void onCreate () {
super . onCreate ();
CalligraphyConfig . initDefault ( new CalligraphyConfig . Builder ()
. setDefaultFontPath ( "fonts/Roboto-RobotoRegular.ttf" )
. setFontAttrId ( R . attr . fontPath )
. build ()
);
//....
}
Remarque: vous n'avez pas besoin de définir CalligraphyConfig
mais la bibliothèque n'appliquera aucune police par défaut et utilisera l'attribut par défaut de R.attr.fontPath
.
Enveloppez le contexte Activity
:
@ Override
protected void attachBaseContext ( Context newBase ) {
super . attachBaseContext ( CalligraphyContextWrapper . wrap ( newBase ));
}
Vous êtes prêt à partir!
< TextView
android : text = " @string/hello_world "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
fontPath = " fonts/Roboto-Bold.ttf " />
Remarque: les IDE populaires (Android Studio, IntelliJ) marquent probablement cela comme une erreur malgré le fait d'être correct. Vous voudrez peut-être ajouter tools:ignore="MissingPrefix"
à la vue elle-même ou à son groupe de vue parent pour éviter cela. Vous devrez ajouter l'espace de noms d'outils pour avoir accès à cet attribut "ignorer". xmlns:tools=" http://schemas.android.com/tools"
. Voir 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 >
Le CalligraphyFactory
recherche la police dans un ordre assez spécifique, pour la plupart, il est très similaire à la façon dont le framework Android résout les attributs.
View
XML - L'attribution définie ici prendra toujours la priorité.Style
XML - ATR défini ici est vérifié ensuite.TextAppearance
XML - ASTR est vérifié ensuite, la seule mise en garde à cela est que si vous avez une police définie dans le Style
et un TextAttribute
défini dans la View
L'attribut Style
est choisi en premier!Theme
- Si défini, ceci est utilisé.Default
- Si défini dans le CalligraphyConfig
il est utilisé de ce qui précède n'est trouvé ou si l'un des éléments ci-dessus renvoie une police non valide.Nous l'avons fait à l'origine, mais il en conflit avec les utilisateurs souhaitant réellement utiliser cet attribut, vous devez maintenant définir un attribut personnalisé.
Nous devions expédier un identifiant personnalisé avec calligraphie pour améliorer le flux d'injection de police. Cela signifie malheureusement qu'il doit être un aar
. Mais vous utilisez Gradle maintenant de toute façon, non?
Il est possible d'utiliser plusieurs polices de caractères à l'intérieur d'un TextView
, ce n'est pas un nouveau concept sur Android.
Cela pourrait être réalisé en utilisant quelque chose comme le code suivant.
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 );
Bien sûr, ce n'est qu'un exemple. Votre kilométrage peut varier.
À nos connaissances (essayez: grep -r -e "void set[^(]*(Typeface " <android source dir>
) Il existe deux widgets Android standard qui ont plusieurs méthodes pour définir les polices. Ce sont:
Les deux ont une méthode appelée setSwitchTypeface
qui définit la police dans le commutateur (par exemple ON / OFF, oui / non). SetTypeface
définit la police de l'étiquette. Vous devrez créer votre propre sous-classe qui remplace setTypeface
et appelle à la fois super.setTypeface
et super.setSwitchTypeface
.
Cette bibliothèque a été créée car il n'est actuellement pas possible de déclarer une police personnalisée dans les fichiers XML dans Android.
Si vous pensez que cela devrait être possible, veuillez mettre ce problème sur le tracker officiel de bugs 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.