View Animation — ระบบอนิเมชันแบบเก่าของ Android API 1+ ที่ทำงานกับออบเจ็กต์ View ผ่าน Tween Animation (Alpha, Translate, Scale, Rotate) Google แนะนำ Property Animation (Animator) สำหรับโปรเจกต์ใหม่ทั้งหมด บทความนี้อธิบายหลักการ ประเภท มาร์กอัป XML และสาเหตุที่ถูกยกเลิก
ประเด็นสำคัญ
View Animation คือระบบย่อยอนิเมชันของ Android ที่ทำงานในระดับ View (API 1+) มันใช้ Tween Animation สี่ประเภท: AlphaAnimation (ความโปร่งใส), TranslateAnimation (การเคลื่อนที่), ScaleAnimation (การปรับขนาด) และ RotateAnimation (การหมุน) อนิเมชันแต่ละรายการอธิบายในไฟล์ XML ในโฟลเดอร์ res/anim/ หรือสร้างโดยโปรแกรมในโค้ด Kotlin
กลไก View Animation ไม่เปลี่ยนคุณสมบัติจริงของ View — มันวาด View ใหม่ในตำแหน่ง ขนาด หรือความโปร่งใสใหม่ แต่การเรียกกลับ onTouchEvent() รับพิกัดของตำแหน่งเดิม นี่คือข้อจำกัดสำคัญที่เรียกว่าความไม่ตรงกันของการคลิก (click mismatch)
ตามเอกสารสำหรับนักพัฒนา Android (2026) Google ทำเครื่องหมาย View Animation เป็น API ที่เลิกใช้แล้วตั้งแต่ Android 3.0 (API 11) สำหรับโปรเจกต์ใหม่ แนะนำให้ใช้ Property Animation — Animator, AnimatorSet และ ObjectAnimator ซึ่งทำงานกับคุณสมบัติจริงของออบเจ็กต์ผ่านเมธอด setter
Tween Animation คืออนิเมชัน “ระหว่าง”คีย์เฟรม: คุณกำหนดสถานะเริ่มต้นและสิ้นสุด และระบบคำนวณเฟรมกลาง Android มีสี่ประเภทมาตรฐาน แต่ละประเภทมีชุดพารามิเตอร์ของตัวเอง
AlphaAnimation เปลี่ยนความโปร่งใสของ View จาก fromAlpha เป็น toAlpha ค่าตั้งแต่ 0.0 (โปร่งใสอย่างสมบูรณ์) ถึง 1.0 (มองเห็นได้อย่างสมบูรณ์) โดยค่าเริ่มต้น อนิเมชันใช้เวลา 300 ms พารามิเตอร์ fillAfter=true ทำให้ View อยู่ในสถานะความโปร่งใสสุดท้าย
<!-- res/anim/fade_out.xml -->
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="500"
android:fillAfter="true" />TranslateAnimation ย้าย View จากตำแหน่งเริ่มต้น (fromXDelta, fromYDelta) ไปยังตำแหน่งสิ้นสุด (toXDelta, toYDelta) ค่าถูกระบุเป็นพิกเซล เปอร์เซ็นต์ของพาเรนต์ หรือเปอร์เซ็นต์ของ View เอง ตัวอย่างเช่น 100% หมายถึง 100% ของความกว้างของ View
ScaleAnimation ปรับขนาด View เทียบกับจุด pivotX/pivotY fromXScale=1.0, toXScale=2.0 เพิ่มความกว้างเป็นสองเท่า พารามิเตอร์ pivotType กำหนดว่าจุดหมุนคำนวณเทียบกับอะไร: self, parent หรือ absolute อนิเมชันปรับขนาดไม่เปลี่ยนขนาดจริงของ View — เปลี่ยนเฉพาะการเรนเดอร์
RotateAnimation หมุน View รอบจุดหมุนด้วยมุมจาก fromDegrees ถึง toDegrees มุมวัดเป็นองศา: 0 คือตำแหน่งเดิม 360 คือการหมุนเต็มรอบ สำหรับการหมุนไม่สิ้นสุด ใช้ repeatCount=INFINITE
ความแตกต่างระหว่าง View Animation และ Property Animation (Animator) คือความแตกต่างพื้นฐานในสถาปัตยกรรมอนิเมชันของ Android View Animation ทำงานเฉพาะกับการเรนเดอร์ ในขณะที่ Property Animation เปลี่ยนคุณสมบัติจริงของออบเจ็กต์ผ่านเมธอด setter ซึ่งนำไปสู่การอัปเดตเลย์เอาต์
| เกณฑ์ | View Animation | Property Animation |
|---|---|---|
| ระดับ API | API 1+ (เลิกใช้แล้ว) | API 11+ (แนะนำ) |
| สิ่งที่อนิเมต | การเรนเดอร์ View (canvas) | คุณสมบัติของออบเจ็กต์ (setter) |
| คลิกหลังอนิเมชัน | ที่ตำแหน่งเดิม | ที่ตำแหน่งใหม่ |
| ประเภทอนิเมชัน | 4 Tween + AnimationSet | ObjectAnimator, ValueAnimator, AnimatorSet |
| LayoutParams | ไม่เปลี่ยน | เปลี่ยนผ่าน setLayoutParams |
| ประสิทธิภาพ | สูง (เฉพาะ canvas) | ปานกลาง (ขึ้นอยู่กับ setter) |
View Animation โดยทั่วไปกำหนดในไฟล์ XML ใน res/anim/ ด้วยองค์ประกอบราก
<!-- res/anim/bounce.xml -->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/bounce_interpolator">
<translate
android:fromYDelta="0%"
android:toYDelta="-100%"
android:duration="600" />
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.3"
android:duration="600" />
</set>ไฟล์ XML ถูกโหลดผ่าน AnimationUtils.loadAnimation() Interpolator กำหนดว่าพารามิเตอร์เปลี่ยนแปลงอย่างไรตามเวลา: accelerate, decelerate, bounce, overshoot Interpolator ที่กำหนดเองสร้างขึ้นผ่านทรัพยากร XML @anim/interpolator_name
อนิเมชัน Tween ทั้งหมดรองรับแอตทริบิวต์: duration (ms), startOffset (หน่วงเวลาก่อนเริ่ม), repeatCount, repeatMode (restart/reverse), fillEnabled, fillBefore, fillAfter, interpolator แอตทริบิวต์ fillAfter กำหนดว่า View จะคงอยู่ในสถานะสุดท้ายของอนิเมชันหลังเสร็จสิ้นหรือไม่
แม้ว่าอนิเมชันมักจะกำหนดใน XML แต่ก็สามารถสร้างโดยโปรแกรมได้โดยใช้ Kotlin วิธีการแบบโปรแกรมมีประโยชน์สำหรับพารามิเตอร์แบบไดนามิก: ค่าความโปร่งใสขึ้นอยู่กับสถานะของแอปพลิเคชันแทนที่จะกำหนดแบบคงที่
// การสร้าง AlphaAnimation โดยโปรแกรมใน Kotlin
import android.view.animation.AlphaAnimation
import android.view.animation.Animation
import android.view.View
fun View.fadeOut(duration: Long = 500L, onEnd: () -> Unit = {}) {
val animation = AlphaAnimation(1.0f, 0.0f).apply {
this.duration = duration
fillAfter = true
setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationEnd(animation: Animation?) { onEnd() }
override fun onAnimationStart(animation: Animation?) {}
override fun onAnimationRepeat(animation: Animation?) {}
})
}
startAnimation(animation)
}
// การโหลดอนิเมชันจาก XML
val bounceAnim = AnimationUtils.loadAnimation(context, R.anim.bounce)
view.startAnimation(bounceAnim)
// AnimationSet — การรวมอนิเมชัน
val set = AnimationSet(true).apply {
addAnimation(TranslateAnimation(0f, 200f, 0f, 0f).apply { duration = 400 })
addAnimation(RotateAnimation(0f, 360f).apply {
duration = 400
pivotX = view.width / 2f
pivotY = view.height / 2f
})
}
view.startAnimation(set)เมธอด startAnimation() เพิ่มอนิเมชันลงในคิวการเรนเดอร์ของ View หากต้องการยกเลิก ให้ใช้ clearAnimation() สำคัญ: fillAfter=true ไม่เปลี่ยน LayoutParams — เมื่อเรียก startAnimation อีกครั้ง อนิเมชันจะเริ่มจากสถานะเดิมของ View ไม่ใช่จากสถานะที่เรนเดอร์ล่าสุด
View Animation มีขอบเขตการใช้งานที่แคบในปี 2026: การรองรับ Android 4.x (API 16-19) ที่ Property Animation อาจทำงานไม่เสถียร; เอฟเฟกต์ปรากฏ/หายไปอย่างง่ายที่ไม่ต้องเปลี่ยน LayoutParams; อนิเมชันที่ความไม่ตรงกันของการคลิกไม่สำคัญ (เช่น องค์ประกอบพื้นหลัง) สำหรับกรณีอื่นทั้งหมด Google แนะนำให้เปลี่ยนไปใช้ ObjectAnimator หรือ AnimatorSet
ตาม Android Developers Property Animation มีประสิทธิภาพด้านหน่วยความจำมากกว่า 15-20% เพราะไม่สร้างเฟรม canvas กลาง การเปลี่ยนจาก View Animation เป็น Property Animation ยังกำจัดปัญหาความไม่ตรงกันของการคลิก: View หลังอนิเมชันรับการสัมผัสที่ตำแหน่งใหม่
คำถามที่พบบ่อย
View Animation เปลี่ยนเฉพาะการเรนเดอร์ของ View — หลังอนิเมชัน View ยังคงอยู่ที่ตำแหน่งเดิมสำหรับเหตุการณ์สัมผัส Property Animation เปลี่ยนคุณสมบัติจริงของออบเจ็กต์ ซึ่งอัปเดต LayoutParams และจัดการคลิกที่ตำแหน่งใหม่อย่างถูกต้อง
Google ประกาศให้ View Animation เลิกใช้ตั้งแต่ Android 3.0 (API 11) สาเหตุคือความไม่ตรงกันของการคลิก (click mismatch) และไม่สามารถอนิเมตคุณสมบัติของออบเจ็กต์ตามอำเภอใจ Property Animation แก้ปัญหาเหล่านี้และแนะนำสำหรับโปรเจกต์ใหม่ทั้งหมด
สามารถใช้ได้แต่ไม่แนะนำ ปุ่มหลัง TranslateAnimation จะแสดงในตำแหน่งใหม่ แต่การคลิกจะลงทะเบียนที่ตำแหน่งเดิม สำหรับปุ่ม ให้ใช้ Property Animation หรือ composable กับ AnimatedVisibility ใน Jetpack Compose
เรียก view.clearAnimation() หากเริ่มอนิเมชันด้วย fillAfter=true View จะคงอยู่ในสถานะสุดท้าย หากต้องการบังคับกลับสู่สถานะเดิม ให้เรียก clearAnimation() และ invalidate()
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม