View Animation — คืออะไร, Tween Animation ใน Android

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

View Animation — ระบบอนิเมชันแบบเก่าของ Android API 1+ ที่ทำงานกับออบเจ็กต์ View ผ่าน Tween Animation (Alpha, Translate, Scale, Rotate) Google แนะนำ Property Animation (Animator) สำหรับโปรเจกต์ใหม่ทั้งหมด บทความนี้อธิบายหลักการ ประเภท มาร์กอัป XML และสาเหตุที่ถูกยกเลิก

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

  • View Animation — อนิเมชัน View ผ่าน Tween Animation: Alpha, Translate, Scale, Rotate
  • คำจำกัดความ XML — อนิเมชันอธิบายใน res/anim/ โดยใช้ , , ,
  • AnimationSet — การรวมหลายอนิเมชันในชุดเดียวกับพารามิเตอร์ที่ใช้ร่วมกัน
  • ข้อจำกัด — View Animation ไม่เปลี่ยนคุณสมบัติ เปลี่ยนเฉพาะการเรนเดอร์: View ยังคงอยู่ที่ตำแหน่งเดิม
  • Property Animation — ตัวแทนสมัยใหม่ (Animator) ที่ทำงานกับคุณสมบัติจริงของออบเจ็กต์

View Animation คืออะไร?

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

Tween Animation คืออนิเมชัน “ระหว่าง”คีย์เฟรม: คุณกำหนดสถานะเริ่มต้นและสิ้นสุด และระบบคำนวณเฟรมกลาง Android มีสี่ประเภทมาตรฐาน แต่ละประเภทมีชุดพารามิเตอร์ของตัวเอง

AlphaAnimation

AlphaAnimation เปลี่ยนความโปร่งใสของ View จาก fromAlpha เป็น toAlpha ค่าตั้งแต่ 0.0 (โปร่งใสอย่างสมบูรณ์) ถึง 1.0 (มองเห็นได้อย่างสมบูรณ์) โดยค่าเริ่มต้น อนิเมชันใช้เวลา 300 ms พารามิเตอร์ fillAfter=true ทำให้ View อยู่ในสถานะความโปร่งใสสุดท้าย

xml
<!-- 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

TranslateAnimation ย้าย View จากตำแหน่งเริ่มต้น (fromXDelta, fromYDelta) ไปยังตำแหน่งสิ้นสุด (toXDelta, toYDelta) ค่าถูกระบุเป็นพิกเซล เปอร์เซ็นต์ของพาเรนต์ หรือเปอร์เซ็นต์ของ View เอง ตัวอย่างเช่น 100% หมายถึง 100% ของความกว้างของ View

ScaleAnimation

ScaleAnimation ปรับขนาด View เทียบกับจุด pivotX/pivotY fromXScale=1.0, toXScale=2.0 เพิ่มความกว้างเป็นสองเท่า พารามิเตอร์ pivotType กำหนดว่าจุดหมุนคำนวณเทียบกับอะไร: self, parent หรือ absolute อนิเมชันปรับขนาดไม่เปลี่ยนขนาดจริงของ View — เปลี่ยนเฉพาะการเรนเดอร์

RotateAnimation

RotateAnimation หมุน View รอบจุดหมุนด้วยมุมจาก fromDegrees ถึง toDegrees มุมวัดเป็นองศา: 0 คือตำแหน่งเดิม 360 คือการหมุนเต็มรอบ สำหรับการหมุนไม่สิ้นสุด ใช้ repeatCount=INFINITE

View Animation เทียบกับ Property Animation

ความแตกต่างระหว่าง View Animation และ Property Animation (Animator) คือความแตกต่างพื้นฐานในสถาปัตยกรรมอนิเมชันของ Android View Animation ทำงานเฉพาะกับการเรนเดอร์ ในขณะที่ Property Animation เปลี่ยนคุณสมบัติจริงของออบเจ็กต์ผ่านเมธอด setter ซึ่งนำไปสู่การอัปเดตเลย์เอาต์

เกณฑ์View AnimationProperty Animation
ระดับ APIAPI 1+ (เลิกใช้แล้ว)API 11+ (แนะนำ)
สิ่งที่อนิเมตการเรนเดอร์ View (canvas)คุณสมบัติของออบเจ็กต์ (setter)
คลิกหลังอนิเมชันที่ตำแหน่งเดิมที่ตำแหน่งใหม่
ประเภทอนิเมชัน4 Tween + AnimationSetObjectAnimator, ValueAnimator, AnimatorSet
LayoutParamsไม่เปลี่ยนเปลี่ยนผ่าน setLayoutParams
ประสิทธิภาพสูง (เฉพาะ canvas)ปานกลาง (ขึ้นอยู่กับ setter)

การกำหนดค่า XML ของอนิเมชัน

View Animation โดยทั่วไปกำหนดในไฟล์ XML ใน res/anim/ ด้วยองค์ประกอบราก (AnimationSet) หรือหนึ่งในสี่ประเภท AnimationSet อนุญาตให้รวมอนิเมชันกับพารามิเตอร์ที่ใช้ร่วมกันเช่น startOffset, duration, interpolator

xml
<!-- 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 จะคงอยู่ในสถานะสุดท้ายของอนิเมชันหลังเสร็จสิ้นหรือไม่

ตัวอย่างโค้ดใน Kotlin

แม้ว่าอนิเมชันมักจะกำหนดใน XML แต่ก็สามารถสร้างโดยโปรแกรมได้โดยใช้ Kotlin วิธีการแบบโปรแกรมมีประโยชน์สำหรับพารามิเตอร์แบบไดนามิก: ค่าความโปร่งใสขึ้นอยู่กับสถานะของแอปพลิเคชันแทนที่จะกำหนดแบบคงที่

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?

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 แตกต่างจาก Property Animation อย่างไร?

View Animation เปลี่ยนเฉพาะการเรนเดอร์ของ View — หลังอนิเมชัน View ยังคงอยู่ที่ตำแหน่งเดิมสำหรับเหตุการณ์สัมผัส Property Animation เปลี่ยนคุณสมบัติจริงของออบเจ็กต์ ซึ่งอัปเดต LayoutParams และจัดการคลิกที่ตำแหน่งใหม่อย่างถูกต้อง

ทำไม View Animation ถึงถือว่าเลิกใช้แล้ว?

Google ประกาศให้ View Animation เลิกใช้ตั้งแต่ Android 3.0 (API 11) สาเหตุคือความไม่ตรงกันของการคลิก (click mismatch) และไม่สามารถอนิเมตคุณสมบัติของออบเจ็กต์ตามอำเภอใจ Property Animation แก้ปัญหาเหล่านี้และแนะนำสำหรับโปรเจกต์ใหม่ทั้งหมด

สามารถใช้ View Animation สำหรับอนิเมชันปุ่มได้หรือไม่?

สามารถใช้ได้แต่ไม่แนะนำ ปุ่มหลัง TranslateAnimation จะแสดงในตำแหน่งใหม่ แต่การคลิกจะลงทะเบียนที่ตำแหน่งเดิม สำหรับปุ่ม ให้ใช้ Property Animation หรือ composable กับ AnimatedVisibility ใน Jetpack Compose

จะยกเลิก View Animation โดยโปรแกรมได้อย่างไร?

เรียก view.clearAnimation() หากเริ่มอนิเมชันด้วย fillAfter=true View จะคงอยู่ในสถานะสุดท้าย หากต้องการบังคับกลับสู่สถานะเดิม ให้เรียก clearAnimation() และ invalidate()

สรุป

  • View Animation — ระบบอนิเมชัน Tween แบบเก่าใน Android มีสี่ประเภท: Alpha, Translate, Scale, Rotate
  • มาร์กอัป XML ใน res/anim/ ด้วยองค์ประกอบ , , , และราก
  • AnimationSet รวมอนิเมชันกับ startOffset, duration, interpolator ที่ใช้ร่วมกัน
  • ความไม่ตรงกันของการคลิก — View หลังอนิเมชันยังคงอยู่ที่ตำแหน่งเดิมสำหรับเหตุการณ์สัมผัส
  • Property Animation — ตัวแทนสมัยใหม่ผ่าน ObjectAnimator, AnimatorSet ทำงานกับคุณสมบัติจริง
  • fillAfter ทำให้ View อยู่ในสถานะสุดท้ายแต่ไม่เปลี่ยน LayoutParams
  • การย้าย ไปยัง Property Animation กำจัดความไม่ตรงกันของการคลิกและปรับปรุงประสิทธิภาพ 15-20%

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

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

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

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