ฟีเจอร์แบบอักษรที่ดาวน์โหลดได้ช่วยให้ API ขอแบบอักษรจากแอปพลิเคชันของผู้ให้บริการได้แทนที่จะรวมไฟล์ไว้ในแอปหรือให้แอปดาวน์โหลดแบบอักษร แบบอักษรที่ดาวน์โหลดได้พร้อมใช้งานในอุปกรณ์ที่ใช้ Android API เวอร์ชัน 14 ขึ้นไปผ่านไลบรารี AndroidX Core
แบบอักษรที่ดาวน์โหลดได้มีข้อดีดังนี้
- ลดขนาดแอป จึงเพิ่มอัตราความสำเร็จในการติดตั้งแอป
- ปรับปรุงประสิทธิภาพโดยรวมของระบบ เนื่องจากแอปหลายแอปสามารถแชร์แบบอักษรเดียวกันผ่านผู้ให้บริการได้ ซึ่งจะช่วยประหยัดอินเทอร์เน็ตมือถือ หน่วยความจำโทรศัพท์ และพื้นที่ดิสก์ของผู้ใช้ ในโมเดลนี้ ระบบจะดึงแบบอักษรผ่านเครือข่ายเมื่อจำเป็น
แบบอักษรที่ดาวน์โหลดได้ทำงานอย่างไร
ผู้ให้บริการแบบอักษรคือแอปพลิเคชันที่ดึงแบบอักษรและแคชแบบอักษรไว้ในเครื่องเพื่อให้แอปอื่นๆ ขอและแชร์แบบอักษรได้ รูปภาพต่อไปนี้แสดงกระบวนการ
ข้อมูลเบื้องต้น
คุณสามารถใช้ฟีเจอร์แบบอักษรที่ดาวน์โหลดได้ด้วยวิธีต่อไปนี้ ซึ่งจะอธิบายรายละเอียดในส่วนต่อๆ ไป
ใช้แบบอักษรที่ดาวน์โหลดได้กับ Android Studio และบริการ Google Play
คุณสามารถตั้งค่าแอปพลิเคชันให้ดาวน์โหลดแบบอักษรได้โดยใช้ Android Studio 3.0 ขึ้นไป หากต้องการเริ่มต้นใช้งานฟีเจอร์แบบอักษรที่ดาวน์โหลดได้ คุณสามารถใช้ผู้ให้บริการแบบอักษรจากบริการ Google Play
- เลือก
TextViewใน เครื่องมือสร้างเลย์เอาต์ จากนั้นเลือก fontFamily > แบบอักษรเพิ่มเติม ในส่วนแอตทริบิวต์ หน้าต่าง Resources จะปรากฏขึ้น
รูปที่ 2 การใช้เครื่องมือสร้างเลย์เอาต์ - เลือก Google Fonts ในเมนู Source
- เลือกแบบอักษรในช่อง Fonts ในส่วน "Downloadable"
- เลือก Create downloadable font แล้วคลิก OK
รูปที่ 3 การเลือกแบบอักษรจากหน้าต่าง Resources
Android Studio จะสร้างไฟล์ XML ที่เกี่ยวข้องซึ่งจำเป็นต่อการแสดงแบบอักษรในแอปอย่างถูกต้องโดยอัตโนมัติ
ใช้แบบอักษรที่ดาวน์โหลดได้แบบเป็นโปรแกรม
ตั้งแต่ Android 8.0 (ระดับ API 26) เป็นต้นมา AndroidX Core รองรับแบบอักษรที่ดาวน์โหลดได้อย่างเต็มรูปแบบ ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ไลบรารี AndroidX Core ได้ที่ ส่วน ไลบรารี AndroidX Core สำหรับแบบอักษรที่ดาวน์โหลดได้ในหน้านี้
หากต้องการใช้ฟีเจอร์แบบอักษรที่ดาวน์โหลดได้แบบเป็นโปรแกรม ให้โต้ตอบกับคลาสหลัก 2 คลาส ได้แก่
android.graphics.fonts.FontRequest: คลาสนี้ช่วยให้คุณสร้างคำขอแบบอักษรได้FontsContractCompat: คลาสนี้ช่วยให้คุณสร้างออบเจ็กต์Typefaceใหม่ตามคำขอแบบอักษรได้
แอปจะดึงแบบอักษรจากผู้ให้บริการแบบอักษรโดยใช้ FontsContract API ผู้ให้บริการแต่ละรายมีข้อจำกัดของตนเองเกี่ยวกับ Android เวอร์ชันและภาษาการค้นหาที่รองรับ ดูข้อมูลเพิ่มเติมเกี่ยวกับ Android เวอร์ชันและรูปแบบการค้นหาได้ในเอกสารประกอบของผู้ให้บริการ
หากต้องการดาวน์โหลดแบบอักษร ให้ทำตามขั้นตอนต่อไปนี้
- สร้างอินสแตนซ์ของคลาส
android.graphics.fonts.FontRequestเพื่อขอแบบอักษรจากผู้ให้บริการ หากต้องการสร้างคำขอ ให้ส่งพารามิเตอร์ต่อไปนี้- สิทธิ์ของผู้ให้บริการแบบอักษร
- แพ็กเกจของผู้ให้บริการแบบอักษรเพื่อยืนยันตัวตนของผู้ให้บริการ
- การค้นหาแบบอักษรที่เป็นสตริง ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบการค้นหาได้ในเอกสารประกอบของผู้ให้บริการแบบอักษร เช่น Google Fonts
- รายการชุดแฮชสำหรับใบรับรองเพื่อยืนยันตัวตนของผู้ให้บริการ
Kotlin
val request = FontRequest( "com.example.fontprovider.authority", "com.example.fontprovider", "my font", certs )
Java
FontRequest request = new FontRequest("com.example.fontprovider", "com.example.fontprovider", "my font", certs);
- สร้างอินสแตนซ์ของคลาส
FontsContract.FontRequestCallback - ลบล้างเมธอด
onTypefaceRetrieved()เพื่อระบุว่าคำขอแบบอักษรเสร็จสมบูรณ์แล้ว ระบุแบบอักษรที่ดึงข้อมูลมาเป็นพารามิเตอร์ คุณสามารถใช้เมธอดนี้เพื่อตั้งค่าแบบอักษรตามต้องการ เช่น ตั้งค่าแบบอักษรในTextView - ลบล้างเมธอด
onTypefaceRequestFailed()เพื่อรับข้อมูลเกี่ยวกับข้อผิดพลาดในกระบวนการขอแบบอักษร ดูข้อมูลเพิ่มเติม เกี่ยวกับรหัสข้อผิดพลาดได้ที่ ค่าคงที่รหัสข้อผิดพลาด - เรียกเมธอด
FontsContract.requestFont()เพื่อดึงแบบอักษรจากผู้ให้บริการแบบอักษร เมธอดจะเริ่มการตรวจสอบเพื่อดูว่าแบบอักษรมีอยู่ในแคชหรือไม่ หากแบบอักษรไม่มีอยู่ในเครื่อง ระบบจะเรียกผู้ให้บริการแบบอักษร ดึงแบบอักษรแบบอะซิงโครนัส และส่งผลลัพธ์ไปยังการเรียกกลับ ส่งพารามิเตอร์ต่อไปนี้- อินสแตนซ์ของ
Contextคลาส - อินสแตนซ์ของคลาส
android.graphics.fonts.FontRequest - การเรียกกลับเพื่อรับผลลัพธ์ของคำขอแบบอักษร
- ตัวจัดการเพื่อดึงแบบอักษรในเธรด
- อินสแตนซ์ของ
โค้ดตัวอย่างต่อไปนี้แสดงกระบวนการโดยรวมของแบบอักษรที่ดาวน์โหลดได้
Kotlin
val request = FontRequest( "com.example.fontprovider.authority", "com.example.fontprovider", "my font", certs ) val callback = object : FontsContract.FontRequestCallback() { override fun onTypefaceRetrieved(typeface: Typeface) { // Your code to use the font goes here. ... } override fun onTypefaceRequestFailed(reason: Int) { // Your code to deal with the failure goes here. ... } } FontsContract.requestFonts(context, request, handler, null, callback)
Java
FontRequest request = new FontRequest("com.example.fontprovider.authority", "com.example.fontprovider", "my font", certs); FontsContract.FontRequestCallback callback = new FontsContract.FontRequestCallback() { @Override public void onTypefaceRetrieved(Typeface typeface) { // Your code to use the font goes here. ... } @Override public void onTypefaceRequestFailed(int reason) { // Your code to deal with the failure goes here. ... } }; FontsContract.requestFonts(context, request, handler, null, callback);
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีดาวน์โหลดแบบอักษรจากผู้ให้บริการแบบอักษรได้ที่แอปตัวอย่าง DownloadableFonts
ใช้แบบอักษรที่ดาวน์โหลดได้กับ AndroidX Core
AndroidX Core รองรับฟีเจอร์แบบอักษรที่ดาวน์โหลดได้ในอุปกรณ์ที่ใช้ Android
API เวอร์ชัน 14 ขึ้นไป แพ็กเกจ androidx.core.provider มีคลาส FontsContractCompat และ FontRequest เพื่อใช้การรองรับฟีเจอร์แบบอักษรที่ดาวน์โหลดได้ซึ่งเข้ากันได้กับเวอร์ชันก่อนหน้า คลาส AndroidX มีเมธอด
ที่คล้ายกับเมธอดเฟรมเวิร์ก และกระบวนการดาวน์โหลดแบบอักษรก็คล้ายกับที่
อธิบายไว้ในส่วนเกี่ยวกับ
การใช้แบบอักษรที่ดาวน์โหลดได้แบบเป็นโปรแกรมในหน้านี้
หากต้องการดาวน์โหลดแบบอักษรโดยใช้ AndroidX ให้นำเข้าคลาส FontsContractCompat และ FontRequest จากแพ็กเกจ androidx.core.provider สร้างอินสแตนซ์ของคลาสเหล่านี้แทนคลาสเฟรมเวิร์ก FontsContract และ android.graphics.fonts.FontRequest
เพิ่มทรัพยากร Dependency ของ AndroidX Core
หากต้องการใช้คลาส FontsContractCompat และ FontRequest คุณต้องแก้ไขทรัพยากร Dependency ของ classpath ของโปรเจ็กต์แอปภายในสภาพแวดล้อมในการพัฒนาซอฟต์แวร์
หากต้องการเพิ่ม AndroidX Core ลงในโปรเจ็กต์แอปพลิเคชัน ให้เพิ่มทรัพยากร Dependency ต่อไปนี้ลงในไฟล์ build.gradle ของแอป
ดึงดูด
dependencies { ... implementation "androidx.core:core-ktx:1.18.0" }
Kotlin
dependencies { ... implementation("androidx.core:core-ktx:1.18.0") }
ใช้แบบอักษรที่ดาวน์โหลดได้เป็นทรัพยากรใน XML
Android 8.0 (ระดับ API 26) และ AndroidX Core มีวิธีที่รวดเร็วและสะดวกยิ่งขึ้นในการประกาศแบบอักษรที่กำหนดเองเป็นทรัพยากรในเลย์เอาต์ XML ซึ่งหมายความว่าคุณไม่จำเป็นต้องรวมแบบอักษรเป็นชิ้นงาน คุณสามารถกำหนดแบบอักษรที่กำหนดเองสำหรับธีมทั้งหมด ซึ่งจะช่วยเร่งความสามารถในการใช้งานสำหรับน้ำหนักและรูปแบบต่างๆ เช่น ตัวหนา ปานกลาง หรือบาง เมื่อมีให้
- สร้างไฟล์ XML ใหม่ในโฟลเดอร์
res/font - เพิ่มองค์ประกอบรูท
<font-family>และตั้งค่าแอตทริบิวต์ที่เกี่ยวข้องกับแบบอักษร ดังที่แสดงในไฟล์ XML ตัวอย่างต่อไปนี้ - อ้างอิงไฟล์เป็น
@font/font_file_nameในไฟล์ XML ของเลย์เอาต์ นอกจากนี้ คุณยัง ใช้getFont()เมธอดเพื่อดึงไฟล์แบบเป็นโปรแกรมได้ด้วย เช่นgetFont(R.font.font_file_name)
<?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android.com/apk/res/android" android:fontProviderAuthority="com.example.fontprovider.authority" android:fontProviderPackage="com.example.fontprovider" android:fontProviderQuery="example font" android:fontProviderCerts="@array/certs"> </font-family>
ประกาศแบบอักษรล่วงหน้าในไฟล์ Manifest
การขยายเลย์เอาต์และการดึงทรัพยากรเป็นงานแบบซิงโครนัส โดยค่าเริ่มต้น การพยายามดึงแบบอักษรครั้งแรกจะทริกเกอร์คำขอไปยังผู้ให้บริการแบบอักษร ซึ่งจะเพิ่มเวลาในการแสดงเลย์เอาต์ครั้งแรก หากต้องการหลีกเลี่ยงความล่าช้า คุณสามารถประกาศแบบอักษรที่ต้องดึงข้อมูลล่วงหน้าในไฟล์ Manifest ได้ หลังจากที่ระบบดึงแบบอักษรจากผู้ให้บริการแล้ว แบบอักษรจะพร้อมใช้งานทันที หากการดึงแบบอักษรใช้เวลานานกว่าที่คาดไว้ ระบบจะยกเลิกกระบวนการดึงข้อมูลและใช้แบบอักษรเริ่มต้น
หากต้องการประกาศแบบอักษรล่วงหน้าในไฟล์ Manifest ให้ทำตามขั้นตอนต่อไปนี้
- สร้างอาร์เรย์ทรัพยากรใน
res/values/arrays.xmlและประกาศแบบอักษรที่ต้องการดึงข้อมูลล่วงหน้า - ใช้แท็ก
meta-dataเพื่อประกาศอาร์เรย์ทรัพยากรในไฟล์ Manifest
res/values/arrays.xml <?xml version="1.0" encoding="utf-8"?> <resources> <array name="preloaded_fonts"> <item>@font/font1</item> <item>@font/font2</item> </array> </resources>
<meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
เพิ่มใบรับรอง
เมื่อผู้ให้บริการแบบอักษรไม่ได้ติดตั้งไว้ล่วงหน้า หรือหากคุณใช้ไลบรารี AndroidX Core ให้ประกาศใบรับรองที่ผู้ให้บริการแบบอักษรลงชื่อ ระบบจะใช้ใบรับรองเพื่อยืนยันตัวตนของผู้ให้บริการแบบอักษร
ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มใบรับรอง
- สร้างอาร์เรย์สตริงที่มีรายละเอียดใบรับรอง ดูข้อมูลเพิ่มเติมเกี่ยวกับรายละเอียดใบรับรองได้ในเอกสารประกอบของผู้ให้บริการแบบอักษร
- ตั้งค่าแอตทริบิวต์
fontProviderCertsเป็นอาร์เรย์
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="certs"> <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item> </string-array> </resources>
android:fontProviderCerts="@array/certs"