ในบางสถานการณ์ รูปภาพต้องเป็นภาพเคลื่อนไหว ซึ่งจะมีประโยชน์ในกรณีที่คุณต้องการแสดงภาพเคลื่อนไหวการโหลดที่กําหนดเองซึ่งประกอบด้วยรูปภาพหลายรูป หรือต้องการให้ไอคอนเปลี่ยนรูปแบบหลังจากการดําเนินการของผู้ใช้ Android มี 2 ตัวเลือกสำหรับภาพเคลื่อนไหวของ Drawable
ตัวเลือกแรกคือการใช้ AnimationDrawable
ซึ่งช่วยให้คุณระบุไฟล์ที่วาดได้แบบคงที่หลายไฟล์ที่แสดงทีละไฟล์เพื่อสร้างภาพเคลื่อนไหวได้ ตัวเลือกที่ 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
ยังไม่ได้แนบกับ
window อย่างสมบูรณ์ หากต้องการเล่นภาพเคลื่อนไหวทันทีโดยไม่ต้องมีการโต้ตอบ คุณสามารถเรียกใช้จากวิธี
ใน onStart()
Activity
ซึ่งจะเรียกใช้เมื่อ Android ทำให้มุมมองปรากฏบนหน้าจอ
ดูข้อมูลเพิ่มเติมเกี่ยวกับไวยากรณ์ XML รวมถึงแท็กและแอตทริบิวต์ที่ใช้ได้ที่แหล่งข้อมูลภาพเคลื่อนไหว
ใช้ AnimatedVectorDrawable
Vector Drawable เป็น Drawable ประเภทหนึ่งที่ปรับขนาดได้โดยไม่แตกเป็นพิกเซลหรือเบลอ คลาสAnimatedVectorDrawable
คลาสและ
AnimatedVectorDrawableCompat
สำหรับความเข้ากันได้แบบย้อนหลังจะช่วยให้คุณสร้างภาพเคลื่อนไหว
ของข้อมูลเวกเตอร์ที่ถอนออกได้เป็นภาพเคลื่อนไหว เช่น การหมุนหรือเปลี่ยนเส้นทางเป็นรูปภาพ
โดยปกติแล้ว คุณกำหนดภาพวาดเวกเตอร์ที่เคลื่อนไหวได้ในไฟล์ XML 3 ไฟล์ ดังนี้
- Vector Drawable ที่มีองค์ประกอบ
<vector>
ในres/drawable/
- Vector Drawable แบบเคลื่อนไหวที่มีองค์ประกอบ
<animated-vector>
ในres/drawable/
- ผู้สร้างภาพเคลื่อนไหวออบเจ็กต์อย่างน้อย 1 รายการที่มีองค์ประกอบ
<objectAnimator>
ในres/animator/
องค์ประกอบภาพวาดเวกเตอร์แบบเคลื่อนไหวสามารถทำให้แอตทริบิวต์ขององค์ประกอบ <group>
และ <path>
เคลื่อนไหวได้ องค์ประกอบ <group>
จะกําหนดชุดเส้นทางหรือกลุ่มย่อย และองค์ประกอบ <path>
จะกําหนดเส้นทางที่จะวาด
เมื่อคุณกำหนดรูปภาพที่วาดได้แบบเวกเตอร์ที่ต้องการสร้างภาพเคลื่อนไหว ให้ใช้แอตทริบิวต์ android:name
เพื่อกำหนดชื่อที่ไม่ซ้ำกันให้กับกลุ่มและเส้นทาง เพื่อให้คุณอ้างอิงจากคำจำกัดความของภาพเคลื่อนไหวได้ เช่น
<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>
การกําหนดค่าภาพวาดเวกเตอร์ที่เคลื่อนไหวจะอ้างอิงกลุ่มและเส้นทางในภาพวาดเวกเตอร์ตามชื่อ
<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 องศา
<objectAnimator android:duration="6000" android:propertyName="rotation" android:valueFrom="0" android:valueTo="360" />
ตัวสร้างภาพเคลื่อนไหวตัวที่ 2 ในตัวอย่างนี้จะเปลี่ยนเส้นทางของเวกเตอร์ที่ถอนออกได้จากรูปร่างหนึ่งไปยังอีกรูปร่างหนึ่ง เส้นทางต้องเข้ากันได้สำหรับการเปลี่ยนรูปแบบ โดยต้องมีจำนวนคำสั่งและพารามิเตอร์เท่ากันสำหรับแต่ละคำสั่ง
<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
ตัวอย่างเวกเตอร์ที่ถอนออกได้แบบเคลื่อนไหว (AVD)
เครื่องมือวาดภาพเวกเตอร์แบบเคลื่อนไหวใน Android Studio ช่วยให้คุณดูตัวอย่างทรัพยากรวาดภาพแบบเคลื่อนไหวได้ เครื่องมือนี้ช่วยให้คุณดูตัวอย่างทรัพยากร <animation-list>
,
<animated-vector>
และ <animated-selector>
ใน Android Studio ได้ และช่วยให้ปรับแต่งภาพเคลื่อนไหวที่กําหนดเองได้ง่ายขึ้น
ดูข้อมูลเพิ่มเติมได้ในข้อมูลอ้างอิง API สำหรับ AnimatedVectorDrawable