แนวคิดและการใช้งาน Jetpack Compose
Android Studio มีเครื่องมือที่เรียกว่า Vector Asset Studio ซึ่งช่วยให้คุณเพิ่มไอคอน Material และนำเข้าไฟล์กราฟิกเวกเตอร์ที่ปรับขนาดได้ (SVG) และไฟล์ Adobe Photoshop Document (PSD) ลงในโปรเจ็กต์เป็นทรัพยากร Vector Drawable การใช้ Vector Drawable แทนบิตแมปจะช่วยลดขนาด APK เนื่องจากสามารถปรับขนาดไฟล์เดียวกันสำหรับความหนาแน่นหน้าจอต่างๆ ได้โดยไม่ทำให้คุณภาพของรูปภาพลดลง สำหรับ Android เวอร์ชันก่อนๆ ที่ไม่รองรับ Vector Drawable นั้น Vector Asset Studio สามารถแปลง Vector Drawable เป็นบิตแมปขนาดต่างๆ สำหรับความหนาแน่นหน้าจอแต่ละรายการในระหว่างเวลาบิลด์
เกี่ยวกับ Vector Asset Studio
Vector Asset Studio จะเพิ่มภาพกราฟิกเวกเตอร์ลงในโปรเจ็กต์เป็นไฟล์ XML ที่อธิบายรูปภาพ การดูแลไฟล์ XML ไฟล์เดียวอาจง่ายกว่าการอัปเดตกราฟิกแรสเตอร์หลายรายการที่ความละเอียดต่างๆ
Android 4.4 (ระดับ API 20) และต่ำกว่าไม่รองรับ Vector Drawable หากตั้งค่าระดับ API ขั้นต่ำเป็นระดับ API เหล่านี้ คุณจะมี 2 ตัวเลือกเมื่อใช้ Vector Asset Studio ได้แก่ สร้างไฟล์ Portable Network Graphic (PNG) (ค่าเริ่มต้น) หรือใช้เทคนิคความเข้ากันได้แบบย้อนหลังใน AndroidX
Vector Asset Studio จะสร้างรูปภาพแรสเตอร์ของ Vector Drawable เพื่อความเข้ากันได้แบบย้อนหลัง ระบบจะรวม Vector Drawable และ Raster Drawable ไว้ด้วยกันใน APK คุณสามารถอ้างอิง Vector Drawable เป็น Drawable ในโค้ด Java หรือ
@drawable ในโค้ด XML และเมื่อแอปทำงาน ระบบจะแสดงรูปภาพเวกเตอร์
หรือแรสเตอร์ที่เกี่ยวข้องโดยอัตโนมัติตามระดับ API
ความเข้ากันได้แบบย้อนหลังใน AndroidX
เทคนิคนี้ต้องใช้ AndroidX 1.0 ขึ้นไปและปลั๊กอิน Android สำหรับ Gradle 3.2 ขึ้นไป และใช้ Vector Drawable เท่านั้น คลาส
VectorDrawableCompat ใน AndroidX ช่วยให้คุณรองรับ
VectorDrawable ใน Android 2.1 (ระดับ API 7) ขึ้นไป
ก่อนใช้ Vector Asset Studio คุณต้องเพิ่มคำสั่งลงในไฟล์ build.gradle ดังนี้
ดึงดูด
android { defaultConfig { vectorDrawables.useSupportLibrary = true } } dependencies { implementation 'androidx.appcompat:appcompat:1.7.1' }
Kotlin
android { defaultConfig { vectorDrawables.useSupportLibrary = true } } dependencies { implementation("androidx.appcompat:appcompat:1.7.1") }
นอกจากนี้ คุณยังต้องใช้เทคนิคการเขียนโค้ด AndroidX เพื่อความเข้ากันได้แบบย้อนหลัง เช่น การใช้แอตทริบิวต์ app:srcCompat แทนแอตทริบิวต์ android:src สำหรับ Vector Drawable ดูข้อมูลเพิ่มเติมได้ที่ AndroidX
การเพิ่ม Vector Drawable ลงในเลย์เอาต์
ในไฟล์เลย์เอาต์ คุณสามารถตั้งค่าวิดเจ็ตที่เกี่ยวข้องกับไอคอน เช่น
ImageButton, ImageView และอื่นๆ ให้ชี้ไปยัง Vector Drawable ได้
ตัวอย่างเช่น เลย์เอาต์ต่อไปนี้แสดง Vector Drawable ที่แสดงบนปุ่ม
รูปที่ 1 Vector Drawable ที่แสดงบนปุ่มในเลย์เอาต์
วิธีแสดง Vector Drawable บนวิดเจ็ตดังที่แสดงในรูป
เปิดโปรเจ็กต์และนำเข้า Vector Drawable
ตัวอย่างนี้ใช้โปรเจ็กต์โทรศัพท์/แท็บเล็ตที่สร้างด้วยตัวช่วยสร้างโปรเจ็กต์ใหม่
ในมุมมอง Android ของหน้าต่าง Project ให้ดับเบิลคลิกไฟล์ XML ของเลย์เอาต์ เช่น
content_main.xmlคลิกแท็บดีไซน์ เพื่อแสดงเครื่องมือสร้างเลย์เอาต์
ลากวิดเจ็ต
ImageButtonจากหน้าต่าง Palette ไปยังเครื่องมือสร้างเลย์เอาต์ในกล่องโต้ตอบ Resources ให้เลือก Drawable ในบานหน้าต่างด้านซ้าย แล้วเลือก Vector Drawable ที่คุณนำเข้า คลิกตกลง
Vector Drawable จะปรากฏบน
ImageButtonในเลย์เอาต์หากต้องการเปลี่ยนสีของรูปภาพเป็นสีเฉพาะจุดที่กำหนดไว้ในธีม ให้ค้นหาพร็อพเพอร์ตี้ tint ในหน้าต่าง Properties แล้วคลิก …
ในกล่องโต้ตอบ Resources ให้เลือก Color ในบานหน้าต่างด้านซ้าย แล้วเลือก colorAccent คลิกตกลง
สีของรูปภาพจะเปลี่ยนเป็นสีเฉพาะจุดในเลย์เอาต์
หากโปรเจ็กต์ใช้ AndroidX โค้ด ImageButton ควรมีลักษณะคล้ายกับโค้ดต่อไปนี้
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/ic_build_black_24dp" tools:layout_editor_absoluteX="11dp" tools:layout_editor_absoluteY="225dp" android:id="@+id/imageButton" android:tint="@color/colorAccent" />
หากโปรเจ็กต์ไม่ได้ใช้ AndroidX โค้ด Vector Drawable จะ
เป็น android:src="@drawable/ic_build_black_24dp" แทน
การอ้างอิง Vector Drawable ในโค้ด
โดยปกติแล้ว คุณสามารถอ้างอิงทรัพยากร Vector Drawable ในโค้ดด้วยวิธีทั่วไป และเมื่อแอปทำงาน ระบบจะแสดงรูปภาพเวกเตอร์หรือแรสเตอร์ที่เกี่ยวข้องโดยอัตโนมัติตามระดับ API
ในกรณีส่วนใหญ่ คุณสามารถอ้างอิง Vector Drawable เป็น
@drawableในโค้ด XML หรือDrawableในโค้ด Javaตัวอย่างเช่น โค้ด XML ของเลย์เอาต์ต่อไปนี้จะใช้รูปภาพกับมุมมอง
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/myimage" />
โค้ดต่อไปนี้จะดึงข้อมูลรูปภาพเป็น
DrawableKotlin
val drawable = resources.getDrawable(R.drawable.myimage, theme)
Java
Resources res = getResources(); Drawable drawable = res.getDrawable(R.drawable.myimage, getTheme());
เมธอด
getResources()อยู่ในคลาสContextซึ่งใช้กับออบเจ็กต์ UI เช่น กิจกรรม, Fragment, เลย์เอาต์, มุมมอง และอื่นๆหากแอปใช้ AndroidX (แม้ว่าคุณจะไม่มีคำสั่ง
vectorDrawables.useSupportLibrary = trueในไฟล์build.gradleก็ตาม) คุณยังอ้างอิง Vector Drawable ด้วยคำสั่งapp:srcCompatได้ด้วย เช่น<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" app:srcCompat="@drawable/myimage" />
บางครั้งคุณอาจต้องแคสต์ประเภททรัพยากรที่ถอนออกได้ เป็นคลาสที่แน่นอน เช่น เมื่อต้องการใช้ฟีเจอร์เฉพาะของ
VectorDrawableคลาส คุณสามารถทำได้โดยใช้โค้ดต่อไปนี้Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val vectorDrawable = drawable as VectorDrawable } else { val bitmapDrawable = drawable as BitmapDrawable }
Java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { VectorDrawable vectorDrawable = (VectorDrawable) drawable; } else { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; }
คุณจะเข้าถึงทรัพยากร Vector Drawable ได้จากเธรดหลักเท่านั้น
สำหรับ Android 5.0 (API ระดับ 21) ขึ้นไป คุณสามารถใช้คลาส
AnimatedVectorDrawable เพื่อสร้างภาพเคลื่อนไหวให้กับพร็อพเพอร์ตี้ของคลาส
VectorDrawable ได้ AndroidX ช่วยให้คุณใช้คลาส
AnimatedVectorDrawableCompat เพื่อสร้างภาพเคลื่อนไหวให้กับคลาส VectorDrawable
สำหรับ Android 3.0 (ระดับ API 11) ขึ้นไปได้ ดูข้อมูลเพิ่มเติมได้ที่
สร้างภาพเคลื่อนไหวให้กับกราฟิก Drawable