Benutzerdefinierte Schriftarten in Android auf eine gute Weise.
Haben Sie satt, benutzerdefinierte Ansichten zum Festlegen von Schriftarten? Oder überqueren Sie den ViewTree, um Textviews zu finden? Ja, ich auch.
Fügen Sie den Abhängigkeits -Download (.AAR) hinzu:
dependencies {
compile ' uk.co.chrisjenx:calligraphy:2.3.0 '
}
Fügen Sie Ihre benutzerdefinierten Schriftarten zu assets/
hinzu. Alle Schriftarten Definitionen sind relativ zu diesem Weg.
Unter der Annahme, dass Sie Gradle verwenden, sollten Sie das Verzeichnis von Assets unter src/main/
in Ihrem Projektverzeichnis erstellen, wenn es noch nicht vorhanden ist. Da es beliebt ist, Multi-Project-Build mit Gradle zu verwenden, ist der Pfad normalerweise app/src/main/assets/
, wobei app
der Projektname ist.
Sie können in Betracht ziehen, eine fonts/
ein Unterverzeichnis im Verzeichnis der Vermögenswerte zu erstellen (wie in Beispielen).
< TextView fontPath = " fonts/MyFont.ttf " />
Hinweis: Der fehlende Namespace ist beabsichtigt.
Definieren Sie Ihre Standardschrift mit CalligraphyConfig
in Ihrer Application
in der Methode #onCreate()
.
@ Override
public void onCreate () {
super . onCreate ();
CalligraphyConfig . initDefault ( new CalligraphyConfig . Builder ()
. setDefaultFontPath ( "fonts/Roboto-RobotoRegular.ttf" )
. setFontAttrId ( R . attr . fontPath )
. build ()
);
//....
}
Hinweis: Sie müssen CalligraphyConfig
nicht definieren, aber die Bibliothek wendet keine Standardschrift an und verwendet das Standardattribut von R.attr.fontPath
.
Wickeln Sie den Activity
ein:
@ Override
protected void attachBaseContext ( Context newBase ) {
super . attachBaseContext ( CalligraphyContextWrapper . wrap ( newBase ));
}
Du bist gut zu gehen!
< TextView
android : text = " @string/hello_world "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
fontPath = " fonts/Roboto-Bold.ttf " />
Hinweis: Das beliebte IDEs (Android Studio, Intellij) wird dies wahrscheinlich als Fehler markieren, obwohl er korrekt ist. Möglicherweise möchten Sie tools:ignore="MissingPrefix"
entweder der Ansicht selbst oder der übergeordneten ViewGroup, um dies zu vermeiden. Sie müssen den Tools -Namespace hinzufügen, um Zugriff auf dieses "Ignorieren" -Merkmal zu erhalten. xmlns:tools=" http://schemas.android.com/tools"
. Siehe 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 >
Der CalligraphyFactory
ist in einer ziemlich spezifischen Reihenfolge nach der Schriftart, zum größten Teil ist es sehr ähnlich, wie das Android -Framework die Attribute auflöst.
View
- ATT, das hier definiert ist, hat immer Priorität.Style
XML - ATTER hier definiert wird als nächstes überprüft.TextAppearance
xml - attr wird als nächstes überprüft. Die einzige Einschränkung ist Style
wenn Sie eine Schrift im Style
definiert und in der View
TextAttribute
wird.Theme
- Wenn dies definiert wird, wird dies verwendet.Default
- Wenn in der CalligraphyConfig
definiert wird, wird dies von keinem der oben genannten gefunden oder wenn einer der oben genannten eine ungültige Schriftart zurückgibt.Wir haben es ursprünglich getan, aber es war mit Benutzern in Konflikt geraten, die dieses Attribut tatsächlich verwenden wollten. Sie müssen jetzt ein benutzerdefiniertes Attribut definieren.
Wir mussten eine benutzerdefinierte ID mit Kalligraphie versenden, um den Schriftartinjektionsfluss zu verbessern. Dies bedeutet leider, dass es ein aar
sein muss. Aber du benutzt Gradle jetzt sowieso, oder?
Es ist möglich, mehrere Schriftarten in einer TextView
zu verwenden. Dies ist kein neues Konzept für Android.
Dies könnte mit dem folgenden Code erreicht werden.
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 );
Natürlich ist dies nur ein Beispiel. Ihre Kilometerleistung kann variieren.
Nach unserem Kenntnisstand (Versuchen Sie: grep -r -e "void set[^(]*(Typeface " <android source dir>
) Es gibt zwei Standard -Android -Widgets, die mehrere Methoden zum Festlegen von Schriftarten haben. Sie sind:
Beide haben eine Methode namens setSwitchTypeface
, mit der die Schrift im Switch (z. B. Ein/Aus -Ja/Nein) festgelegt wird. SetTypeface
Legt die Schrift des Etiketts fest. Sie müssen Ihre eigene Unterklasse erstellen, die setTypeface
überschreibt und sowohl super.setTypeface
als auch super.setSwitchTypeface
aufruft.
Diese Bibliothek wurde erstellt, weil es derzeit nicht möglich ist, eine benutzerdefinierte Schriftart in XML -Dateien in Android zu deklarieren.
Wenn Sie der Meinung sind, dass dies möglich sein sollte, spielen Sie dieses Problem auf dem offiziellen Android -Bug -Tracker.
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.