View Animation — là gì, Tween Animation trong Android

Tác giả: IT Sectr Đã đăng: 2026-03-01 Thời gian đọc: 8 phút

View Animation là hệ thống hoạt ảnh kế thừa của Android API 1+ hoạt động với các đối tượng View thông qua Tween Animation (Alpha, Translate, Scale, Rotate). Google khuyến nghị Property Animation (Animator) cho tất cả các dự án mới. Bài viết này giải thích các nguyên tắc, loại, đánh dấu XML và lý do ngừng sử dụng.

Những điểm chính

  • View Animation — tạo hoạt ảnh View qua Tween Animation: Alpha, Translate, Scale, Rotate
  • Định nghĩa XML — hoạt ảnh được mô tả trong res/anim/ bằng , , ,
  • AnimationSet — kết hợp nhiều hoạt ảnh trong một tập hợp với các tham số chung
  • Hạn chế — View Animation không thay đổi thuộc tính, chỉ thay đổi cách hiển thị: View vẫn ở vị trí ban đầu
  • Property Animation — thay thế hiện đại (Animator) làm việc với các thuộc tính thực của đối tượng

View Animation là gì?

View Animation là một hệ thống con hoạt ảnh của Android hoạt động ở cấp độ View (API 1+). Nó sử dụng bốn loại Tween Animation: AlphaAnimation (độ trong suốt), TranslateAnimation (di chuyển), ScaleAnimation (tỷ lệ) và RotateAnimation (xoay). Mỗi hoạt ảnh được mô tả trong tệp XML trong thư mục res/anim/ hoặc được tạo theo chương trình trong mã Kotlin.

Cơ chế View Animation không thay đổi các thuộc tính thực của View — nó vẽ lại View ở vị trí, tỷ lệ hoặc độ trong suốt mới, nhưng lệnh gọi lại onTouchEvent() nhận tọa độ của vị trí ban đầu. Đây là hạn chế chính được gọi là sự không khớp khi nhấp (click mismatch).

Theo Tài liệu dành cho nhà phát triển Android (2026), Google đã đánh dấu View Animation là API không được khuyến khích kể từ Android 3.0 (API 11). Đối với các dự án mới, Property Animation được khuyến nghị — Animator, AnimatorSet và ObjectAnimator, hoạt động với các thuộc tính thực của đối tượng thông qua các phương thức setter.

Các loại Tween Animation

Tween Animation là hoạt ảnh “giữa” các khung hình chính: bạn xác định trạng thái bắt đầu và kết thúc, và hệ thống tính toán các khung hình trung gian. Android cung cấp bốn loại tiêu chuẩn, mỗi loại có tập tham số riêng.

AlphaAnimation

AlphaAnimation thay đổi độ trong suốt của View từ fromAlpha đến toAlpha. Các giá trị từ 0.0 (hoàn toàn trong suốt) đến 1.0 (hoàn toàn nhìn thấy). Theo mặc định, hoạt ảnh kéo dài 300 ms. Tham số fillAfter=true giữ View ở trạng thái trong suốt cuối cùng.

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 di chuyển View từ vị trí bắt đầu (fromXDelta, fromYDelta) đến vị trí kết thúc (toXDelta, toYDelta). Các giá trị được chỉ định bằng pixel, phần trăm của phần tử cha hoặc phần trăm của chính View. Ví dụ: 100% có nghĩa là 100% chiều rộng của View.

ScaleAnimation

ScaleAnimation thay đổi tỷ lệ View so với điểm pivotX/pivotY. fromXScale=1.0, toXScale=2.0 nhân đôi chiều rộng. Tham số pivotType xác định pivot được tính so với cái gì: self, parent hoặc absolute. Hoạt ảnh tỷ lệ không thay đổi kích thước thực của View — chỉ thay đổi cách hiển thị.

RotateAnimation

RotateAnimation xoay View quanh một điểm pivot theo góc từ fromDegrees đến toDegrees. Góc được đo bằng độ: 0 là vị trí ban đầu, 360 là một vòng xoay đầy đủ. Để xoay vô hạn, hãy sử dụng repeatCount=INFINITE.

View Animation vs Property Animation

Sự khác biệt giữa View Animation và Property Animation (Animator) là sự khác biệt cơ bản trong kiến trúc hoạt ảnh Android. View Animation chỉ hoạt động trên cách hiển thị, trong khi Property Animation thay đổi các thuộc tính thực của đối tượng thông qua các phương thức setter, dẫn đến cập nhật bố cục.

Tiêu chíView AnimationProperty Animation
Cấp APIAPI 1+ (không được khuyến khích)API 11+ (được khuyến nghị)
Đối tượng hoạt ảnhCách hiển thị View (canvas)Thuộc tính đối tượng (setter)
Nhấp sau hoạt ảnhỞ vị trí ban đầuỞ vị trí mới
Loại hoạt ảnh4 Tween + AnimationSetObjectAnimator, ValueAnimator, AnimatorSet
LayoutParamsKhông thay đổiThay đổi qua setLayoutParams
Hiệu suấtCao (chỉ canvas)Trung bình (phụ thuộc vào setter)

Cấu hình XML hoạt ảnh

View Animation thường được định nghĩa trong các tệp XML trong res/anim/ với phần tử gốc (AnimationSet) hoặc một trong bốn loại. AnimationSet cho phép kết hợp các hoạt ảnh với các tham số chung như 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>

Tệp XML được tải qua AnimationUtils.loadAnimation(). Interpolator xác định cách tham số thay đổi theo thời gian: accelerate, decelerate, bounce, overshoot. Interpolator tùy chỉnh được tạo qua tài nguyên XML @anim/interpolator_name.

Các thuộc tính chung

Tất cả các hoạt ảnh Tween đều hỗ trợ các thuộc tính: duration (ms), startOffset (độ trễ trước khi bắt đầu), repeatCount, repeatMode (restart/reverse), fillEnabled, fillBefore, fillAfter, interpolator. Thuộc tính fillAfter xác định liệu View có giữ nguyên trạng thái cuối cùng của hoạt ảnh sau khi hoàn thành hay không.

Ví dụ mã Kotlin

Mặc dù hoạt ảnh thường được định nghĩa trong XML, chúng cũng có thể được tạo theo chương trình bằng Kotlin. Cách tiếp cận theo chương trình hữu ích cho các tham số động: giá trị độ trong suốt phụ thuộc vào trạng thái ứng dụng thay vì được định nghĩa tĩnh.

kotlin
// Tạo AlphaAnimation theo chương trình trong 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)
}

// Tải hoạt ảnh từ XML
val bounceAnim = AnimationUtils.loadAnimation(context, R.anim.bounce)
view.startAnimation(bounceAnim)

// AnimationSet — kết hợp các hoạt ảnh
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)

Phương thức startAnimation() thêm hoạt ảnh vào hàng đợi hiển thị của View. Để hủy, hãy sử dụng clearAnimation(). Quan trọng: fillAfter=true không thay đổi LayoutParams — khi startAnimation được gọi lại, hoạt ảnh bắt đầu từ trạng thái ban đầu của View, không phải từ trạng thái được hiển thị cuối cùng.

Khi nào sử dụng View Animation?

View Animation có phạm vi ứng dụng hẹp trong năm 2026: hỗ trợ Android 4.x (API 16-19) nơi Property Animation có thể hoạt động không ổn định; các hiệu ứng xuất hiện/biến mất đơn giản không yêu cầu thay đổi LayoutParams; các hoạt ảnh nơi sự không khớp khi nhấp không quan trọng (ví dụ: các phần tử nền). Đối với tất cả các trường hợp khác, Google khuyến nghị chuyển sang ObjectAnimator hoặc AnimatorSet.

Theo Android Developers, Property Animation hiệu quả hơn 15-20% về bộ nhớ vì nó không tạo các khung canvas trung gian. Chuyển từ View Animation sang Property Animation cũng loại bỏ vấn đề không khớp khi nhấp: View sau hoạt ảnh nhận các thao tác chạm ở vị trí mới.

Các câu hỏi thường gặp

View Animation khác Property Animation như thế nào?

View Animation chỉ thay đổi cách hiển thị của View — sau hoạt ảnh, View vẫn ở vị trí ban đầu cho các sự kiện chạm. Property Animation thay đổi các thuộc tính thực của đối tượng, cập nhật LayoutParams và xử lý nhấp chính xác ở vị trí mới.

Tại sao View Animation bị coi là không được khuyến khích?

Google đã tuyên bố View Animation không được khuyến khích kể từ Android 3.0 (API 11). Nguyên nhân là sự không khớp khi nhấp (click mismatch) và không thể tạo hoạt ảnh cho các thuộc tính đối tượng tùy ý. Property Animation giải quyết những vấn đề này và được khuyến nghị cho tất cả các dự án mới.

Có thể sử dụng View Animation để tạo hoạt ảnh cho nút không?

Có thể sử dụng nhưng không được khuyến nghị. Một nút sau TranslateAnimation sẽ hiển thị ở vị trí mới, nhưng các nhấp chuột sẽ được đăng ký ở vị trí ban đầu. Đối với các nút, hãy sử dụng Property Animation hoặc composable với AnimatedVisibility trong Jetpack Compose.

Làm thế nào để hủy View Animation theo chương trình?

Gọi view.clearAnimation(). Nếu hoạt ảnh được bắt đầu với fillAfter=true, View sẽ giữ nguyên trạng thái cuối cùng. Để buộc quay lại trạng thái ban đầu, hãy gọi clearAnimation() và invalidate().

Tổng kết

  • View Animation — hệ thống hoạt ảnh Tween kế thừa trong Android với bốn loại: Alpha, Translate, Scale, Rotate
  • Đánh dấu XML trong res/anim/ với các phần tử , , , và gốc
  • AnimationSet kết hợp các hoạt ảnh với startOffset, duration, interpolator chung
  • Không khớp khi nhấp — View sau hoạt ảnh vẫn ở vị trí ban đầu cho các sự kiện chạm
  • Property Animation — thay thế hiện đại qua ObjectAnimator, AnimatorSet, làm việc với các thuộc tính thực
  • fillAfter giữ View ở trạng thái cuối cùng nhưng không thay đổi LayoutParams
  • Di chuyển sang Property Animation loại bỏ sự không khớp khi nhấp và cải thiện hiệu suất 15-20%

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm