Font khusus di Android dengan cara yang ok.
Apakah Anda muak dengan tampilan khusus untuk mengatur font? Atau melintasi viewtree untuk menemukan TextViews? Ya saya juga.
Sertakan unduhan ketergantungan (.aar):
dependencies {
compile ' uk.co.chrisjenx:calligraphy:2.3.0 '
}
Tambahkan font khusus Anda ke assets/
. Semua definisi font relatif terhadap jalur ini.
Dengan asumsi bahwa Anda menggunakan Gradle, Anda harus membuat direktori aset di bawah src/main/
di direktori proyek Anda jika belum ada. Karena populer untuk menggunakan multi-proyek build dengan gradle, jalur biasanya adalah app/src/main/assets/
, di mana app
adalah nama proyek.
Anda dapat mempertimbangkan untuk membuat fonts/
subdirektori di direktori aset (seperti dalam contoh).
< TextView fontPath = " fonts/MyFont.ttf " />
Catatan: Namespace yang hilang, ini disengaja.
Tentukan font default Anda menggunakan CalligraphyConfig
, di kelas Application
Anda di metode #onCreate()
.
@ Override
public void onCreate () {
super . onCreate ();
CalligraphyConfig . initDefault ( new CalligraphyConfig . Builder ()
. setDefaultFontPath ( "fonts/Roboto-RobotoRegular.ttf" )
. setFontAttrId ( R . attr . fontPath )
. build ()
);
//....
}
Catatan: Anda tidak perlu mendefinisikan CalligraphyConfig
tetapi perpustakaan tidak akan menerapkan tidak ada font default dan menggunakan atribut default dari R.attr.fontPath
.
Bungkus konteks Activity
:
@ Override
protected void attachBaseContext ( Context newBase ) {
super . attachBaseContext ( CalligraphyContextWrapper . wrap ( newBase ));
}
Anda baik untuk pergi!
< TextView
android : text = " @string/hello_world "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
fontPath = " fonts/Roboto-Bold.ttf " />
Catatan: IDE populer (Android Studio, IntelliJ) kemungkinan akan menandai ini sebagai kesalahan meskipun benar. Anda mungkin ingin menambahkan tools:ignore="MissingPrefix"
ke tampilan itu sendiri atau kelompok view induknya untuk menghindari ini. Anda harus menambahkan namespace alat untuk memiliki akses ke atribut "abaikan" ini. xmlns:tools=" http://schemas.android.com/tools"
. Lihat 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
mencari font dalam urutan yang cukup spesifik, untuk sebagian besar sangat mirip dengan bagaimana kerangka kerja Android menyelesaikan atribut.
View
XML - ATTR yang ditentukan di sini akan selalu diprioritaskan.Style
XML - ATTR yang ditentukan di sini diperiksa berikutnya.TextAppearance
XML - Attr diperiksa berikutnya, satu -satunya peringatan untuk ini adalah jika Anda memiliki font yang didefinisikan dalam Style
dan TextAttribute
yang didefinisikan dalam View
atribut Style
dipilih terlebih dahulu!Theme
- jika didefinisikan ini digunakan.Default
- Jika didefinisikan dalam CalligraphyConfig
Ini digunakan untuk tidak ada di atas yang ditemukan atau jika salah satu dari yang di atas mengembalikan font yang tidak valid.Kami awalnya melakukannya, tetapi bertentangan dengan pengguna yang ingin benar -benar menggunakan atribut itu, Anda sekarang harus mendefinisikan atribut khusus.
Kami perlu mengirimkan ID khusus dengan kaligrafi untuk meningkatkan aliran injeksi font. Sayangnya ini berarti bahwa itu harus menjadi aar
. Tapi Anda menggunakan Gradle sekarang kan?
Dimungkinkan untuk menggunakan beberapa tipografi di dalam TextView
, ini bukan konsep baru untuk Android.
Ini bisa dicapai dengan menggunakan sesuatu seperti kode berikut.
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 );
Tentu saja ini hanya sebuah contoh. Jarak tempuh Anda mungkin bervariasi.
Sepengetahuan kami (coba: grep -r -e "void set[^(]*(Typeface " <android source dir>
) Ada dua widget Android standar yang memiliki banyak metode untuk mengatur jenis huruf. Mereka adalah:
Keduanya memiliki metode yang disebut setSwitchTypeface
yang mengatur jenis huruf di dalam sakelar (misalnya on/off, ya/tidak). SetTypeface
mengatur jenis huruf label. Anda perlu membuat subclass sendiri yang mengesampingkan setTypeface
dan memanggil super.setTypeface
dan super.setSwitchTypeface
.
Perpustakaan ini dibuat karena saat ini tidak mungkin untuk mendeklarasikan font khusus dalam file XML di Android.
Jika Anda merasa ini harus dilakukan, silakan bintangi masalah ini di pelacak Bug Android resmi.
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.