Vector Drawable: คืออะไร, รูปแบบ XML และทำงานอย่างไร

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-06-12 เวลาอ่าน: 9 นาที

Vector Drawable คือรูปแบบกราฟิกเวกเตอร์สำหรับ Android ที่ใช้ XML เป็นพื้นฐาน และช่วยให้สร้างภาพที่ปรับขนาดได้โดยไม่สูญเสียคุณภาพ ต่างจาก PNG และ JPEG เวกเตอร์จะเก็บโครงร่างทางเรขาคณิตและการเติมเป็นคำสั่งข้อความ ซึ่งให้ขนาดไฟล์ที่เล็กที่สุดและการปรับให้เข้ากับความหนาแน่นของหน้าจอทุกประเภท ตาม เอกสารของ Android Developers (2026) Vector Drawable ลดขนาด APK โดยเฉลี่ย 40–60% เมื่อเทียบกับชุดทรัพยากรแรสเตอร์สำหรับความละเอียดต่างๆ

ประเด็นสำคัญ

  • Vector Drawable คือรูปแบบกราฟิกเวกเตอร์ Android ที่ใช้ XML เป็นพื้นฐาน มาตรฐานตั้งแต่ API 21
  • การปรับขนาด โดยไม่สูญเสียคุณภาพ — เวกเตอร์ปรับให้เข้ากับความหนาแน่นของหน้าจอทุกประเภท (mdpi, hdpi, xhdpi และสูงกว่า)
  • ขนาด APK ลดลง 40–60% โดยการแทนที่ไฟล์ PNG หลายไฟล์ด้วยไฟล์ XML เดียว
  • แอนิเมชัน รองรับผ่าน AnimatedVectorDrawable และ AnimatedStateListDrawable
  • การปรับ ให้เข้ากับธีมมืดทำได้โดยแอตทริบิวต์ android:theme โดยไม่ต้องทำซ้ำทรัพยากร

Vector Drawable คืออะไร?

Vector Drawable คือทรัพยากร Android ที่แสดงภาพเวกเตอร์ในรูปแบบ XML โดยอิงตามข้อกำหนด SVG (Scalable Vector Graphics) Google เปิดตัวรูปแบบนี้ใน Android 5.0 (API 21) เพื่อเป็นทางเลือกแทนภาพแรสเตอร์สำหรับไอคอน ภาพประกอบ และองค์ประกอบกราฟิกอื่นๆ ของอินเทอร์เฟซ

ต่างจาก PNG ที่ภาพถูกเก็บเป็นอาร์เรย์พิกเซลขนาดคงที่ Vector Drawable อธิบายรูปร่างทางคณิตศาสตร์ — ผ่านพิกัดจุด เส้นโค้งเบซิเยร์ การเติม และเส้นขอบ ซึ่งหมายความว่าภาพเวกเตอร์เดี่ยวสามารถแทนที่ได้ถึง หกไฟล์ PNG สำหรับความหนาแน่นหน้าจอต่างๆ (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi) ซึ่งช่วยลดความซับซ้อนในการบำรุงรักษาทรัพยากรกราฟิกได้อย่างมาก

รูปแบบรองรับไม่เพียงแค่ภาพนิ่ง แต่ยังรวมถึงแอนิเมชันผ่าน AnimatedVectorDrawable รวมถึงการปรับให้เข้ากับธีมมืดและสีที่กำหนดเองผ่านแอตทริบิวต์ธีม ตั้งแต่ Android 7.0 (API 24) Vector Drawable ยังรองรับการเติมแบบเกรเดียนต์และการดำเนินการคลิปที่ซับซ้อน (clipPath) ซึ่งขยายความเป็นไปได้ในการออกแบบ

ส่วนประกอบหลักของ Vector Drawable

Vector Drawable แต่ละตัวประกอบด้วยองค์ประกอบราก vector พร้อมพารามิเตอร์ความกว้าง ความสูง และ viewport — ระบบพิกัดเสมือนที่ใช้วาดรูปร่าง ภายในประกอบด้วยกลุ่ม (group) และเส้นทาง (path) โดย path กำหนดเรขาคณิตผ่านลำดับคำสั่ง: M (moveTo), L (lineTo), C (cubicTo), Z (close) และอื่นๆ แต่ละ path สามารถมี fillColor และ strokeColor ของตัวเอง ซึ่งสามารถอ้างอิงทรัพยากรธีมได้

องค์ประกอบเพิ่มเติมรวมถึง clip-path สำหรับการคลิป, gradient สำหรับการเปลี่ยนสีแบบเกรเดียนต์ และแอตทริบิวต์การปรับให้เข้ากับธีมมืดผ่านแอตทริบิวต์ android:theme สีทั้งหมดใน Vector Drawable สามารถระบุเป็นข้อมูลอ้างอิงถึงแอตทริบิวต์ธีม (เช่น ?attr/colorPrimary) ซึ่งเปลี่ยนลักษณะของไอคอนเมื่อเปลี่ยนธีมโดยไม่ต้องทำซ้ำทรัพยากร

รูปแบบ Vector Drawable: โครงสร้าง XML

ไฟล์ XML ของ Vector Drawable วางอยู่ในไดเรกทอรี res/drawable/ และมีองค์ประกอบราก ภายในสามารถมีองค์ประกอบ ที่ซ้อนกันเพื่อจัดลำดับชั้น และองค์ประกอบ เพื่ออธิบายโครงร่าง แต่ละ path มีแอตทริบิวต์ pathData — สตริงของคำสั่งการวาดในรูปแบบเส้นทาง SVG

xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">

    <path
        android:fillColor="@color/ic_launcher_background"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2z"
        android:strokeWidth="1"
        android:strokeColor="#333333"/>

</vector>

ในตัวอย่าง อธิบายวงกลมที่มีรัศมี 10 หน่วยใน viewport 24×24 พารามิเตอร์ fillColor อ้างอิงทรัพยากรสี ในขณะที่ strokeWidth และ strokeColor กำหนดเส้นขอบ ความกว้างและความสูงระบุเป็น dp — ซึ่งรับประกันการปรับขนาดที่ถูกต้องบนหน้าจอที่มีความหนาแน่นพิกเซลต่างกันโดยไม่ต้องแปลงเพิ่มเติม

การจัดกลุ่มและการแปลง

องค์ประกอบ group ช่วยให้จัดกลุ่มหลาย path และใช้การแปลงร่วมกัน: การหมุน (rotation), การเลื่อน (translateX, translateY) และการปรับขนาด (scaleX, scaleY) กลุ่มสามารถซ้อนกันได้ ทำให้สามารถสร้างลำดับชั้นที่ซับซ้อนด้วยองค์ประกอบนับร้อยโดยไม่สูญเสียประสิทธิภาพ

xml
<vector ...>
    <group android:name="arrow_group"
        android:pivotX="12"
        android:pivotY="12"
        android:rotation="90">
        <path .../>
    </group>
</vector>

การจัดกลุ่มด้วยแอตทริบิวต์ pivotX/pivotY ใช้สำหรับแอนิเมชัน: คุณสามารถหมุนหรือปรับขนาดส่วนหนึ่งของภาพโดยแยกจากองค์ประกอบอื่นๆ ซึ่งมีประโยชน์โดยเฉพาะสำหรับการสร้างไอคอนสถานะแบบเคลื่อนไหว (เช่น การโหลด → สำเร็จ)

Vector Drawable เปรียบเทียบกับกราฟิกแรสเตอร์

การเลือกระหว่างกราฟิกเวกเตอร์และแรสเตอร์ขึ้นอยู่กับกรณีการใช้งาน Vector Drawable เหมาะสำหรับไอคอน ภาพประกอบ และองค์ประกอบอินเทอร์เฟซที่มีรายละเอียดน้อย ในขณะที่ภาพถ่ายและภาพซับซ้อนที่มีสีหลายพันสียังคงอยู่ในรูปแบบแรสเตอร์

พารามิเตอร์Vector DrawablePNG
การปรับขนาดไม่สูญเสียคุณภาพสูญเสียเมื่อขยาย
ขนาดไฟล์0.5–5 KB10–100 KB ต่อความละเอียด
จำนวนไฟล์1 XML6 PNG (mdpi–xxxhdpi)
แอนิเมชันรองรับสลับเฟรมเท่านั้น
การปรับธีมผ่าน ?attrชุดแยกต่างหาก
ฉากซับซ้อนจำกัดใดๆ

ตาม Android Performance Patterns (Google I/O 2016) การแทนที่ไอคอน PNG ด้วย Vector Drawable ลดขนาด APK ลง 40–60% สำหรับแอปพลิเคชันที่มีทรัพยากรกราฟิกจำนวนมาก อย่างไรก็ตาม เมื่อเรนเดอร์เวกเตอร์ที่ซับซ้อนด้วย path หลายร้อยรายการ โหลด CPU จะเพิ่มขึ้น ดังนั้นสำหรับแอนิเมชันและการวาดซ้ำบ่อยๆ แนะนำให้ใช้แรสเตอร์ที่แคชไว้ล่วงหน้า

เมื่อใดควรเลือก Vector Drawable

Vector Drawable เหมาะที่สุดสำหรับไอคอนอินเทอร์เฟซ (แถบเครื่องมือ การนำทาง สถานะ) โลโก้ ภาพประกอบง่ายๆ และองค์ประกอบที่เคลื่อนไหวได้ รูปแบบนี้มีประโยชน์โดยเฉพาะเมื่อรองรับหลายหน้าจอ: แทนที่จะสร้าง PNG สำหรับหกความหนาแน่น ไฟล์ XML เดียวก็เพียงพอ ซึ่งช่วยลดความซับซ้อนในการบำรุงรักษาการออกแบบและกำจัดข้อผิดพลาดเรื่องขนาดไม่ตรงกัน สำหรับภาพถ่ายและภาพที่มีเกรเดียนต์เสมือนจริง ยังคงใช้รูปแบบแรสเตอร์ที่มีการบีบอัด WebP

แอนิเมชัน Vector Drawable

Android รองรับแอนิเมชัน Vector Drawable ผ่านสองกลไก: AnimatedVectorDrawable (ใช้งานได้ตั้งแต่ API 21) และ AnimatedStateListDrawable กลไกแรกช่วยให้เคลื่อนไหวแอตทริบิวต์ path — การหมุน การเลื่อน การเปลี่ยนสี และการเปลี่ยนรูปร่าง กลไกที่สองสลับระหว่างสถานะต่างๆ (กด, ไฮไลต์) ด้วยการเปลี่ยนภาพที่นุ่มนวล

AnimatedVectorDrawable ใช้ไฟล์ XML สามไฟล์: Vector Drawable เอง, ObjectAnimator ที่อธิบายแอนิเมชัน และ AnimatedVectorDrawable ที่เชื่อมโยงซึ่งเชื่อมต่อเป้าหมาย (ชื่อกลุ่มหรือ path) เข้ากับ animator แอนิเมชันสามารถเปลี่ยน fillColor, strokeColor, rotation, translateX/Y, scaleX/Y และแม้แต่ pathData — แปลงรูปร่างหนึ่งเป็นอีกรูปร่างหนึ่งอย่างนุ่มนวล (morphing)

ตัวอย่างแอนิเมชัน morphing

พิจารณาแอนิเมชันที่ไอคอนบวกเปลี่ยนเป็นไอคอนปิด ข้อจำกัดหลัก: จำนวนคำสั่ง pathData ต้องตรงกันในสถานะเริ่มต้นและสุดท้าย มิฉะนั้นแอนิเมชันจะไม่ทำงาน

xml
<!-- res/drawable/anim_plus_to_close.xml -->
<animated-vector xmlns:android="...">
    <target
        android:name="plus_path"
        android:animation="@anim/plus_to_close"/>
</animated-vector>

ObjectAnimator plus_to_close เปลี่ยนคุณสมบัติ pathData จากรูปร่างบวกเดิมเป็นรูปร่างปิดภายใน 300 มิลลิวินาที ระบบจะประมาณค่าพิกัดระหว่างสองชุดคำสั่งเส้นทาง SVG โดยอัตโนมัติ แอนิเมชันประเภทนี้ใช้กันอย่างแพร่หลายใน Material Design สำหรับการเปลี่ยนสถานะของปุ่มและไอคอนอย่างนุ่มนวล

ตัวอย่างโค้ด Vector Drawable

มาดูตัวอย่าง XML เวกเตอร์ที่สมบูรณ์สำหรับไอคอน ลูกศรกลับ ที่รองรับธีมมืด สีถูกกำหนดผ่านการอ้างอิงถึงแอตทริบิวต์ธีม ซึ่งเปลี่ยนสีไอคอนโดยอัตโนมัติเมื่อสลับระหว่างธีมสว่างและธีมมืดโดยไม่ต้องทำซ้ำทรัพยากร

xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">

    <group android:name="arrow">
        <path
            android:fillColor="@android:color/white"
            android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    </group>

</vector>

พารามิเตอร์ android:tint ด้วยค่า ?attr/colorControlNormal จะใช้สีควบคุมของระบบโดยอัตโนมัติ — สีเทาเข้มบนธีมสว่าง สีขาวบนธีมมืด กลุ่มที่ชื่อ arrow ช่วยให้เคลื่อนไหวไอคอนนี้ผ่าน AnimatedVectorDrawable

การโหลด Vector Drawable จากโค้ด

ในการโหลด Vector Drawable จากโปรแกรมใน Android ให้ใช้คลาส AppCompatResources.getDrawable() หรือเมธอด ContextCompat.getDrawable() ในโปรเจกต์ Jetpack Compose สมัยใหม่ Drawable แบบแรสเตอร์และเวกเตอร์จะถูกโหลดผ่าน painterResource ซึ่งจะกำหนดรูปแบบทรัพยากรโดยอัตโนมัติ

kotlin
import androidx.appcompat.content.res.AppCompatResources

val vectorDrawable = AppCompatResources.getDrawable(
    context,
    R.drawable.ic_arrow_back
)

// Jetpack Compose
Icon(
    painter = painterResource(R.drawable.ic_arrow_back),
    contentDescription = "Back",
    tint = MaterialTheme.colorScheme.onSurface
)

เมื่อใช้ AppCompatResources.getDrawable() ไลบรารี AppCompat จะเลือกรุ่น drawable ที่ถูกต้องโดยอัตโนมัติตามระดับ API: บนอุปกรณ์ก่อน Android 5.0 (API 21) อาจใช้แรสเตอร์สำรอง (fallback); บนอุปกรณ์ใหม่กว่าจะใช้ Vector Drawable ใน Jetpack Compose painterResource จะจัดการความเข้ากันได้นี้โดยอัตโนมัติ

คำถามที่พบบ่อย

Vector Drawable รองรับตั้งแต่ Android เวอร์ชันใด?

Vector Drawable รองรับโดยตรงตั้งแต่ Android 5.0 (API 21) สำหรับเวอร์ชันเก่ากว่า ต้องใช้ไลบรารี AppCompat (ทรัพยากรเวกเตอร์ทำงานผ่านไลบรารีนี้บนอุปกรณ์ที่มี API 7+) นอกจากนี้仍需ตั้งค่า flag vectorDrawables.useSupportLibrary = true ใน build.gradle

สามารถใช้ Vector Drawable ใน Jetpack Compose ได้หรือไม่?

ได้ Jetpack Compose รองรับ Vector Drawable ผ่านฟังก์ชัน painterResource() ส่วนประกอบ Icon จะโหลดทรัพยากรเวกเตอร์จาก res/drawable/ โดยอัตโนมัติและใช้ธีม Material สำหรับการปรับสี เวกเตอร์จะปรับขนาดโดยไม่สูญเสียคุณภาพไปยังขนาดใดๆ ที่ระบุผ่านพารามิเตอร์ modifier

ความแตกต่างระหว่าง Vector Drawable และ SVG คืออะไร?

SVG เป็นมาตรฐานเว็บสากลที่มีชุดคุณสมบัติมากมาย (ฟิลเตอร์, มาสก์, สไตล์ในตัว) Vector Drawable เป็นเวอร์ชันที่ปรับให้เข้ากับ Android โดยมีชุดคำสั่ง SVG ย่อยที่จำกัด Android ไม่รองรับ SVG โดยตรง รองรับเฉพาะ Vector Drawable ที่สร้างจาก SVG ผ่าน Android Studio Asset Studio

จะแปลง SVG เป็น Vector Drawable ได้อย่างไร?

วิธีที่ง่ายที่สุดคือใช้ Android Studio: คลิกขวาที่โฟลเดอร์ drawable → New → Vector Asset → Import local SVG file Studio จะปรับแต่ง SVG โดยอัตโนมัติและสร้าง XML Vector Drawable อีกทางเลือกหนึ่งคือตัวแปลงออนไลน์เช่น SVG2VectorDrawable หรือ ShapeShifter ซึ่งรองรับการส่งออกพร้อมแอนิเมชัน

ทำไม Vector Drawable ไม่แสดงบนอุปกรณ์เก่า?

ปัญหามักเกี่ยวข้องกับการขาดการสนับสนุน AppCompat ตรวจสอบให้แน่ใจว่าใน build.gradle ได้ตั้งค่า flag vectorDrawables.useSupportLibrary = true และใช้ AppCompatDelegate นอกจากนี้ยังตรวจสอบว่า Vector Drawable ไม่มีคุณสมบัติที่ไม่มีในเวอร์ชันของไลบรารี AppCompat ที่ใช้

สรุป

  • Vector Drawable คือรูปแบบกราฟิกเวกเตอร์ Android ที่ใช้ XML เป็นพื้นฐาน มาตรฐานตั้งแต่ API 21
  • การปรับขนาด โดยไม่สูญเสียคุณภาพ — ไฟล์ XML เดียวแทนที่ภาพแรสเตอร์หกภาพสำหรับความหนาแน่นต่างๆ
  • ขนาด APK ลดลง 40–60% เมื่อแทนที่ไอคอน PNG ด้วยเวกเตอร์เทียบเท่า
  • แอนิเมชัน ดำเนินการผ่าน AnimatedVectorDrawable รองรับการเปลี่ยนรูปร่างและการเปลี่ยนสี
  • ธีมมืด รองรับผ่านแอตทริบิวต์ ?attr/colorControlNormal และ android:theme
  • AppCompat ให้ความเข้ากันได้ย้อนหลังถึง Android 2.3 (API 7) ผ่าน useSupportLibrary
  • ใช้ Vector Drawable สำหรับไอคอนและองค์ประกอบอินเทอร์เฟซ, PNG/WebP สำหรับภาพเสมือนจริง

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม