23 March 2017

ลองเล่น Font Resource ของเล่นใหม่จาก Android O

Updated on

        ผู้ที่หลงเข้ามาอ่านหลายๆคนก็คงจะตื่นเต้นกันไม่น้อยกับการมาของ Android O ที่ยังเป็น Developer Preview อยู่ ซึ่งการมาของ Developer Preview ก็จะช่วยให้นักพัฒนาได้เตรียมพร้อมก่อนที่ Android O จะปล่อยให้คนทั่วไปได้ใช้งานกัน และในระหว่างที่เจ้าของบล็อกนั่งอัปเดตเกี่ยวกับ Android O ก็ได้พบกับฟีเจอร์ใหม่ที่น่าสนใจที่ชื่อว่า Font Style

ในที่สุด Font Resource ก็มาแล้ววววววว

        ปัญหาเดิมๆที่ผู้ที่หลงเข้ามาอ่านเคยเจอกันก็คืออยากจะ Custom Font ในแอปฯของตัวเอง แล้วต้องเขียนอะไรเยอะมาก เพราะไม่สามารถกำหนดเป็น XML Resource ได้โดยตรง แถมไฟล์ฟอนต์ก็ต้องเก็บไว้ใน Asset แล้วสั่งผ่านคำสั่ง Java ซึ่งเจ้าของบล็อกเคยเขียนเรื่องนี้ไว้ใน [Android Design] สิ่งที่ควรจะรู้เมื่อต้องตะลุยไปกับงานแอนดรอยด์ที่เกี่ยวกับ Font สุดหรรษา

        ล่าสุดได้มีการเพิ่ม Font Resource เข้ามาให้ใน Android O แล้ว ซึ่งผู้ที่หลงเข้ามาอ่านสามารถ Custom Font ได้ง่ายขึ้นเสียที (น้ำตาจะไหล)


        โดยผู้ที่หลงเข้ามาอ่านสามารถสร้าง Font Resource ใน res ได้ทันที โดยใช้ชื่อว่า font แล้วโยนฟอนต์ไว้ในนี้ได้เลยไม่ว่าจะเป็น .ttf หรือ .otf

        สามารถกดเปิดไฟล์เพื่อทดลองพิมพ์ได้ด้วยนะเออ



        เวลาเรียกใช้งานก็กำหนดด้วย Attribute ที่ชื่อว่า android:fontFamily ได้เลย

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/th_sarabun_new"
    android:text="Hello World!" />

        หรืออยากจะทำเป็น Style ก็ได้เช่นกัน

<style name="CustomTextStyle" parent="TextAppearance.AppCompat">
    <item name="android:fontFamily">@font/th_sarabun_new</item>
</style>

        โคตรง่ายยยยยยยย

        และเมื่อมี Font Resource นั่นก็หมายความว่าผู้ที่หลงเข้ามาอ่านสามารถทำ Custom View ที่มี Custom Attribute รองรับ Custom Font ได้ด้วยนะเออ

Typeface titleTypeface;
Typeface detailTypeface;

...

TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.CustomInfoCard);
titleTypeface = typedArray.getFont(R.styleable.CustomInfoCard_titleFontStyle);
detailTypeface = typedArray.getFont(R.styleable.CustomInfoCard_detailFontStyle);
typedArray.recycle();

        เย้ เย

ทำชีวิตให้ง่ายขึ้นด้วย Font Family

        นอกจากนี้ยังมี Font Family ให้ใช้งานด้วย เพื่อรองรับการแสดง Font Style ในแบบต่างๆ โดยสร้างไฟล์ Font Style เป็น XML ไว้ใน Font Resource ได้เลย


        โดยจะใช้ <font-style> ... </font-style>

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    
    <font
        android:font="@font/th_sarabun_new_normal"
        android:fontStyle="normal" />

    <font
        android:font="@font/th_sarabun_new_italic"
        android:fontStyle="italic" />

</font-family>

        จากที่ลองพบว่ายังไม่มีผลอะไรใดๆกับฟอนต์​ ถึงแม้ว่าจะกำหนด Text Style หรือ Font Style แล้วก็ตาม ซึ่งไม่แน่ใจว่าเพราะเป็น Preview Developer หรือป่าว และก็ยังไม่มีข้อมูลอธิบายอะไรตรงนี้มากนัก ไว้จะมาอัปเดตแก้ไขตรงนี้ในภายหลังนะครับ

เรียกใช้ Font Resource ผ่านโค้ด Java

        สามารถเรียก Font Resource ได้เหมือนกับ Resource ตัวอื่นๆผ่านโค้ด Java ดังนี้

Typeface typeface = getResources().getFont(R.font.th_sarabun_new_bold);
textView.setTypeface(typeface);

เพิ่ม FontManager เพื่อเข้าถึง Font อื่นๆที่มีอยู่ใน System

        บน API 26 จะมีคำสั่ง FontManger ที่จะช่วยจัดการเกี่ยวกับ Font หลักๆในตอนนี้ก็คือสามารถดึง Font ที่มีอยู่ในเครื่องได้ด้วยคำสั่ง

FontManager fontManager = getSystemService(FontManager.class);
FontConfig systemFontConfig = fontManager.getSystemFonts();

        ซึ่ง FontConfig ที่ได้จะเป็นข้อมูลของ Font ทุกตัวที่อยู่ใน System Font เพื่อเอาไปใช้งานอีกทีนั่นเอง ซึ่งตอนนี้ยังไม่มีข้อมูลเกี่ยวกับการเรียกใช้งานนัก

        แต่ถ้าให้เดาก็คือนักพัฒนาสามารถเรียก Font ในเครื่องมาใช้งานได้ด้วย Font Provider ซึ่งเพิ่มเข้ามาใหม่ใน API 26 เช่นกัน

        เพราะแอบไปสังเกตเห็นว่า TypeFace มีการเพิ่มคำสั่งแบบ Asynchronous เข้ามาด้วย (เดิมที Typeface จะดึง Font มาใช้งานแบบ Synchronous เพียงอย่างเดียว) ที่สามารถกำหนดได้ว่าจะดึง Font อะไร แล้ว Font Provider จะส่งกลับมาให้ทาง Callback

FontRequest fontRequest = new FontRequest(providerAuthority, query);
Typeface.create(fontRequest, new Typeface.FontRequestCallback() {
    @Override
    public void onTypefaceRetrieved(Typeface typeface) {

    }

    @Override
    public void onTypefaceRequestFailed(int i) {

    }
});

        ซึ่งตรงนี้ก็ยังไม่มีข้อมูลเช่นกันจ้า ในตอนนี้ยังมีแค่ API Reference ให้ดูเท่านั้น

สรุป

        ในที่สุดแอนดรอยด์ก็มี Font Resource ให้ใช้งานได้ง่ายๆเสียที (น้ำตาจะไหล) ซึ่งอาจจะดูไม่แตกต่างอะไรกับของเดิมมากนัก แต่ Font Resource นั้นจะช่วยให้ผู้ที่หลงเข้ามาอ่านสามารถประยุกต์ใช้งานได้หลากหลายมากขึ้น เช่น แสดงผลของ Font บน View ต่างๆ โดยที่ไม่ต้องไปจัดการอะไรมากนัก และการทำ Custom View ที่เวลานำไปใช้งานจะสามารถกำหนด Font ได้ง่ายขึ้น รวมไปถึง FontProvider ที่เพิ่มเข้าใหม่ที่น่าจะมีแนวโน้มว่าต่อไป Font ในเครื่องแอนดรอยด์สามารถรองรับกับการทำงานของแอปฯได้หลากหลายขึ้น

        แต่ที่น่าเศร้าก็คือเรื่องของ Backward Compatibility นี่แหละ เพราะว่าในตอนนี้ Font Resource ไม่รองรับกับเวอร์ชันที่ต่ำกว่า API 26 ก็ต้องรอลุ้นกันอีกทีว่าจะมีให้ใช้งานใน Android Support Library กันในอนาคตหรือไม่ และก็ต้องรอดูต่อไปว่าจะมีอัปเดตอะไรอีกบ้าง เพราะในตอนนี้ยังเป็นแค่ Developer Preview 1 เท่านั้นเองนะ

แหล่งข้อมูลอ้างอิง

        • Working With Fonts [Android Developers]