ในบางกรณี คุณอาจต้องสร้างภาพเคลื่อนไหว ซึ่งจะมีประโยชน์ในกรณีที่คุณต้องการแสดงภาพเคลื่อนไหวการโหลดที่กำหนดเองซึ่งประกอบด้วยรูปภาพหลายรูป หรือหากต้องการให้ไอคอนเปลี่ยนรูปร่างหลังจากที่ผู้ใช้ดำเนินการ Android มีตัวเลือก 2 แบบสำหรับการเคลื่อนไหว Drawable
ตัวเลือกแรกคือการใช้ AnimationDrawable ซึ่งจะช่วยให้คุณระบุไฟล์ Drawable แบบคงที่หลายไฟล์ที่แสดงทีละไฟล์เพื่อสร้างภาพเคลื่อนไหวได้
ตัวเลือกที่ 2 คือการใช้
AnimatedVectorDrawable ซึ่งช่วยให้คุณทำให้พร็อพเพอร์ตี้
ของ Vector Drawable เคลื่อนไหวได้
ใช้ AnimationDrawable
วิธีหนึ่งในการสร้างภาพเคลื่อนไหวคือการโหลดลำดับของทรัพยากรที่วาดได้ เช่น ม้วนฟิล์ม
คลาส AnimationDrawable
เป็นพื้นฐานสำหรับภาพเคลื่อนไหวที่วาดได้ประเภทนี้
คุณกำหนดเฟรมของภาพเคลื่อนไหวในโค้ดได้โดยใช้ AnimationDrawable
Class API แต่การกำหนดเฟรมด้วยไฟล์ XML ไฟล์เดียวที่แสดงรายการเฟรมที่ประกอบกันเป็นภาพเคลื่อนไหวจะง่ายกว่า
ไฟล์ XML สำหรับภาพเคลื่อนไหวประเภทนี้จะอยู่ในไดเรกทอรี res/drawable/
ของโปรเจ็กต์ Android ในกรณีนี้ คำสั่งจะระบุลำดับและระยะเวลาของ
แต่ละเฟรมในภาพเคลื่อนไหว
ไฟล์ XML ประกอบด้วยองค์ประกอบ <animation-list> เป็นโหนดรูท และชุดโหนด <item> ย่อยที่แต่ละโหนดกำหนดเฟรม ซึ่งเป็นทรัพยากรที่วาดได้และระยะเวลาของเฟรม ต่อไปนี้คือตัวอย่างไฟล์ XML สำหรับภาพเคลื่อนไหว Drawable
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/rocket_thrust1" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust2" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust3" android:duration="200" /> </animation-list>
ภาพเคลื่อนไหวนี้จะทำงานเป็นเวลา 3 เฟรม การตั้งค่าแอตทริบิวต์ android:oneshot
ของรายการเป็น true จะทำให้รายการวนซ้ำ 1 ครั้งแล้วหยุดและค้างไว้ที่เฟรมสุดท้าย
หากตั้งค่า android:oneshot เป็น false
ภาพเคลื่อนไหวจะวนซ้ำ
หากบันทึก XML นี้เป็น rocket_thrust.xml ในไดเรกทอรี res/drawable/
ของโปรเจ็กต์ คุณจะเพิ่มเป็นภาพพื้นหลังใน View แล้วเรียก start() เพื่อให้เล่นได้ ต่อไปนี้คือตัวอย่างกิจกรรมที่เพิ่มภาพเคลื่อนไหวลงใน
ImageView แล้วจึงเคลื่อนไหว
เมื่อแตะหน้าจอ
Kotlin
private lateinit var rocketAnimation: AnimationDrawable override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val rocketImage = findViewById<ImageView>(R.id.rocket_image).apply { setBackgroundResource(R.drawable.rocket_thrust) rocketAnimation = background as AnimationDrawable } rocketImage.setOnClickListener({ rocketAnimation.start() }) }
Java
AnimationDrawable rocketAnimation; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image); rocketImage.setBackgroundResource(R.drawable.rocket_thrust); rocketAnimation = (AnimationDrawable) rocketImage.getBackground(); rocketImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { rocketAnimation.start(); } }); }
โปรดทราบว่าคุณไม่สามารถเรียกใช้start()เมธอดที่เรียกใช้ใน AnimationDrawable ระหว่างเมธอด onCreate() ของ Activity ได้ เนื่องจาก AnimationDrawable ยังไม่ได้เชื่อมต่อกับหน้าต่างอย่างสมบูรณ์ หากต้องการเล่นภาพเคลื่อนไหวทันทีโดยไม่ต้องมีการโต้ตอบ คุณสามารถเรียกใช้จากเมธอด
ใน onStart()Activity ซึ่งจะเรียกใช้เมื่อ Android ทำให้มุมมองปรากฏบนหน้าจอ
ดูข้อมูลเพิ่มเติมเกี่ยวกับไวยากรณ์ XML รวมถึงแท็กและแอตทริบิวต์ที่ใช้ได้ที่แหล่งข้อมูลภาพเคลื่อนไหว
ใช้ AnimatedVectorDrawable
Vector Drawable
เป็น Drawable ประเภทหนึ่งที่ปรับขนาดได้โดยไม่เกิดภาพแตกหรือเบลอ คลาส
AnimatedVectorDrawableและ
AnimatedVectorDrawableCompat เพื่อความเข้ากันได้แบบย้อนหลังช่วยให้คุณเคลื่อนไหว
พร็อพเพอร์ตี้ของ VectorDrawable เช่น หมุนหรือเปลี่ยนข้อมูลเส้นทางเพื่อเปลี่ยนเป็น
รูปภาพอื่น
โดยปกติแล้ว คุณจะกำหนด AnimatedVectorDrawable ในไฟล์ XML 3 ไฟล์ ดังนี้
- Vector Drawable ที่มีองค์ประกอบ
<vector>ในres/drawable/ - Vector Drawable ที่เคลื่อนไหวได้ซึ่งมีองค์ประกอบ
<animated-vector>ในres/drawable/ - ObjectAnimator อย่างน้อย 1 รายการที่มีองค์ประกอบ
<objectAnimator>ในres/animator/
ภาพวาดเวกเตอร์เคลื่อนไหวสามารถทำให้แอตทริบิวต์ขององค์ประกอบ <group> และ
<path> เคลื่อนไหวได้ องค์ประกอบ <group> กำหนดชุดเส้นทางหรือกลุ่มย่อย และองค์ประกอบ <path> กำหนดเส้นทางที่จะวาด
เมื่อกำหนด Vector Drawable ที่ต้องการเคลื่อนไหว ให้ใช้แอตทริบิวต์ android:name
เพื่อกำหนดชื่อที่ไม่ซ้ำกันให้กับกลุ่มและเส้นทาง เพื่อให้คุณอ้างอิงกลุ่มและเส้นทางเหล่านั้นจากคำจำกัดความของ Animator ได้
เช่น
res/drawable/vectordrawable.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="64dp" android:width="64dp" android:viewportHeight="600" android:viewportWidth="600"> <group android:name="rotationGroup" android:pivotX="300.0" android:pivotY="300.0" android:rotation="45.0" > <path android:name="v" android:fillColor="#000000" android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /> </group> </vector>
คำจำกัดความของ AnimatedVectorDrawable จะอ้างอิงถึงกลุ่มและเส้นทางใน Vector Drawable ตามชื่อของกลุ่มและเส้นทาง
res/drawable/animatorvectordrawable.xml
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/vectordrawable" > <target android:name="rotationGroup" android:animation="@animator/rotation" /> <target android:name="v" android:animation="@animator/path_morph" /> </animated-vector>
คำจำกัดความของภาพเคลื่อนไหวแสดงถึงออบเจ็กต์
ObjectAnimator หรือ
AnimatorSet
ออบเจ็กต์เคลื่อนไหวแรกในตัวอย่างนี้จะหมุนกลุ่มเป้าหมาย 360 องศา
res/animator/rotation.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="6000" android:propertyName="rotation" android:valueFrom="0" android:valueTo="360" /> </set>
Animator ตัวที่ 2 ในตัวอย่างนี้จะเปลี่ยนเส้นทางของ Vector Drawable จากรูปร่างหนึ่งไปเป็นอีกรูปร่างหนึ่ง เส้นทางต้องเข้ากันได้สำหรับการมอร์ฟ โดยต้องมีจำนวนคำสั่งเท่ากัน และมีจำนวนพารามิเตอร์เท่ากันสำหรับแต่ละคำสั่ง
res/animator/path_morph.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="3000" android:propertyName="pathData" android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z" android:valueTo="M300,70 l 0,-70 70,0 0,140 -70,0 z" android:valueType="pathType" /> </set>
AnimatedVectorDrawable ที่ได้มีดังนี้
AnimatedVectorDrawableตัวอย่าง Animated Vector Drawable (AVD)
เครื่องมือ Animated Vector Drawable ใน Android Studio ช่วยให้คุณดูตัวอย่างทรัพยากร Drawable ที่เคลื่อนไหวได้
เครื่องมือนี้ช่วยให้คุณดูตัวอย่างทรัพยากร <animation-list>,
<animated-vector> และ <animated-selector> ใน
Android Studio และช่วยให้ปรับแต่งภาพเคลื่อนไหวที่กำหนดเองได้ง่ายขึ้น
ดูข้อมูลเพิ่มเติมได้ที่เอกสารอ้างอิง API สำหรับ
AnimatedVectorDrawable