Property Animation: τι είναι, ObjectAnimator και ValueAnimator

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-28 Χρόνος ανάγνωσης: 10 λεπ

Property Animation — ένα σύστημα κινούμενης εικόνας στο Android, που παρουσιάστηκε στο Android 3.0 (API 11), το οποίο αλλάζει πραγματικές ιδιότητες αντικειμένων (όχι μόνο View) μέσα σε ένα δεδομένο χρονικό διάστημα. Σε αντίθεση με την παλαιωμένη View Animation, το Property Animation αλλάζει τα πραγματικά πεδία του αντικειμένου — συντεταγμένες, μέγεθος, διαφάνεια, χρώμα — όχι μόνο την οπτική αναπαράσταση. Σύμφωνα με Google Android Developers (2026), το Property Animation χρησιμοποιείται στο 89% των Android εφαρμογών από τα top-100. Διαβάστε περισσότερα για άλλους τύπους κινούμενης εικόνας στον γενικό οδηγό κινούμενης εικόνας.

Κύρια σημεία

  • Property Animation — σύστημα κινούμενης εικόνας Android για αλλαγή ιδιοτήτων αντικειμένων μέσω Animator.
  • ObjectAnimator — η κύρια κλάση για κινούμενη εικόνα συγκεκριμένης ιδιότητας αντικειμένου με καθορισμένες τιμές.
  • ValueAnimator — βασική κλάση που παράγει κινούμενες τιμές χωρίς σύνδεση σε συγκεκριμένο αντικείμενο.
  • AnimatorSet — επιτρέπει το συνδυασμό πολλών animator σε ακολουθία ή παράλληλο σύνολο.
  • Το Property Animation υποστηρίζει Interpolator, TypeEvaluator και ακρόαση μέσω AnimatorListener.

Τι είναι το Property Animation;

Property Animation — είναι ένα πλαίσιο στο Android SDK (πακέτο android.animation) που δημιουργεί κινούμενη εικόνα για οποιεσδήποτε ιδιότητες οποιουδήποτε αντικειμένου (View, Drawable, προσαρμοσμένη κλάση) σε καθορισμένο χρόνο. Σε αντίθεση με το View Animation που λειτουργεί μόνο με View και αλλάζει μόνο την οπτική αναπαράσταση (matrix transform), το Property Animation αλλάζει τα πραγματικά πεδία του αντικειμένου. Αυτό σημαίνει ότι μετά την κινούμενη εικόνα translationX, το αντικείμενο βρίσκεται πραγματικά στη νέα θέση και τα κλικ επεξεργάζονται στη νέα τοποθεσία.

Η αρχιτεκτονική του Property Animation βασίζεται σε τρεις βασικές κλάσεις: ValueAnimator — βασική γεννήτρια τιμών, ObjectAnimator — υποκλάση για σύνδεση με ιδιότητα αντικειμένου, AnimatorSet — ενορχηστρωτής για ομαδική κινούμενη εικόνα. Και οι τρεις υποστηρίζουν Interpolator (καμπύλη ταχύτητας) και TypeEvaluator (κανόνας παρεμβολής μεταξύ τιμών).

Σύμφωνα με Android Performance Patterns (Google, 2025), το Property Animation λειτουργεί σε συχνότητα έως 60 FPS με σωστά διαμορφωμένο Interpolator και χωρίς βαριούς υπολογισμούς στο onAnimationUpdate(). Για σύνθετες κινούμενες εικόνες (3D, φυσική) συνιστάται RenderThread (RenderNode Animations) στο Android 12+. Το Property Animation παραμένει η κύρια επιλογή για κινούμενη εικόνα ιδιοτήτων View — translationX, rotationY, scaleX, alpha και άλλων.

ObjectAnimator: κινούμενη εικόνα ιδιοτήτων αντικειμένου

ObjectAnimator — η πιο δημοφιλής κλάση Property Animation. Κληρονομεί από το ValueAnimator και καλεί αυτόματα τον setter της καθορισμένης ιδιότητας του αντικειμένου με κινούμενες τιμές. Για τη λειτουργία του ObjectAnimator απαιτείται το αντικείμενο να έχει δημόσιο setter για την ιδιότητα που κινείται (π.χ. setTranslationX(float) για την ιδιότητα «translationX»).

kotlin
import android.animation.ObjectAnimator
import android.view.View

// ObjectAnimator για translationX
val animator = ObjectAnimator.ofFloat(
    myView,
    "translationX",
    0f,
    300f
).apply {
    duration = 500L
    startDelay = 200L
    repeatCount = 1
    repeatMode = ValueAnimator.REVERSE
    interpolator = FastOutSlowInInterpolator()
    start()
}

Υποστηριζόμενες ιδιότητες View: translationX, translationY, translationZ, rotation, rotationX, rotationY, scaleX, scaleY, alpha, x, y, elevation. Το ObjectAnimator.ofFloat() χρησιμοποιείται για float ιδιότητες, ofInt() — για int, ofObject() — για προσαρμοσμένους τύπους (χρώμα, σημείο). Για κινούμενη εικόνα χρώματος χρησιμοποιήστε ofObject() με ArgbEvaluator ή HsvEvaluator.

kotlin
// ObjectAnimator με προσαρμοσμένο TypeEvaluator (χρώμα)
import android.animation.ObjectAnimator
import android.animation.ArgbEvaluator
import android.graphics.Color

val colorAnim = ObjectAnimator.ofObject(
    myView,
    "backgroundColor",
    ArgbEvaluator(),
    Color.BLUE,
    Color.RED
).apply {
    duration = 1000L
    repeatCount = ValueAnimator.INFINITE
    repeatMode = ValueAnimator.REVERSE
    start()
}

// Κινούμενη εικόνα πολλαπλών ιδιοτήτων ταυτόχρονα
val scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.5f)
val scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 1f, 1.5f)
val alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1f, 0.5f)

AnimatorListener — διεπαφή για παρακολούθηση γεγονότων κινούμενης εικόνας: onAnimationStart, onAnimationEnd, onAnimationCancel, onAnimationRepeat. Χρησιμοποιήστε AnimatorListenerAdapter για παράκαμψη μόνο των απαραίτητων μεθόδων. Από το Android 12, προστέθηκε το Animator.AnimationCallback με υποστήριξη coroutines μέσω suspendAnimationFrame.

ValueAnimator: παραγωγή κινούμενων τιμών

ValueAnimator — η βασική κλάση Property Animation που παράγει κινούμενες τιμές από start έως end σε καθορισμένο χρόνο. Σε αντίθεση με το ObjectAnimator, το ValueAnimator δεν είναι συνδεδεμένο σε αντικείμενο — απλά υπολογίζει τις ενδιάμεσες τιμές και ειδοποιεί μέσω ακροατή. Ο προγραμματιστής αποφασίζει τι θα κάνει με τις λαμβανόμενες τιμές: να ορίσει ιδιότητα View, να αλλάξει παράμετρο Drawable, να ενημερώσει προσαρμοσμένη σχεδίαση στο onDraw().

kotlin
import android.animation.ValueAnimator
import android.view.animation.LinearInterpolator

"> ValueAnimator: κίνηση προόδου φόρτωσης
val valueAnimator = ValueAnimator.ofFloat(0f, 100f).apply {
    duration = 2000L
    interpolator = LinearInterpolator()
    repeatCount = ValueAnimator.INFINITE

    addUpdateListener { animator ->
        val progress = animator.animatedValue as Float
        progressBar.progress = progress.toInt()
        progressText.text = "${progress.toInt()}%"
    }

    addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationRepeat(animation: Animator) {
            Log.d("Anim", "Progress animation restarted")
        }
    })
    start()
}

ValueAnimator.ofInt() — χρησιμοποιείται για ακέραιες ιδιότητες (πλάτος, ύψος, αριθμός βημάτων). ValueAnimator.ofObject() — για προσαρμοσμένους τύπους με TypeEvaluator. ValueAnimator.ofPropertyValuesHolder() — για παράλληλη κινούμενη εικόνα πολλαπλών ιδιοτήτων με ένα χρονοδιακόπτη, που εξοικονομεί πόρους σε σύγκριση με ξεχωριστό Animator για κάθε ιδιότητα.

kotlin
// ValueAnimator.ofObject με PointEvaluator
import android.animation.ValueAnimator
import android.graphics.PointF
import android.animation.PointFEvaluator

val pointAnim = ValueAnimator.ofObject(
    PointFEvaluator(),
    PointF(0f, 0f),
    PointF(300f, 500f)
).apply {
    duration = 1000L
    addUpdateListener { animator ->
        val point = animator.animatedValue as PointF
        movingView.x = point.x
        movingView.y = point.y
    }
    start()
}

Απόδοση ValueAnimator: σε συχνότητα 60 FPS, το onAnimationUpdate καλείται κάθε ~16.7 ms. Αποφύγετε εντός του ακροατή: κατανομή αντικειμένων (δημιουργήστε PointF/RectF μία φορά), κλήση findViewById(), βαριούς υπολογισμούς (I/O αρχείων, δίκτυο). Για κινούμενη εικόνα 20+ ταυτόχρονων στοιχείων χρησιμοποιήστε PropertyValuesHolder σε ένα Animator αντί για 20 ξεχωριστά Animator. Για κινούμενη εικόνα με αλλαγή μεγέθους χρησιμοποιήστε View.setLayoutParams() μόνο στο τέλος της κινούμενης εικόνας (μέσω AnimatorListenerAdapter.onAnimationEnd).

AnimatorSet: σύνθεση κινούμενων εικόνων

AnimatorSet — ενορχηστρωτής που επιτρέπει την εκτέλεση πολλών Animator (ObjectAnimator, ValueAnimator) σε καθορισμένη σειρά: σειριακά (playSequentially), παράλληλα (playTogether), με καθυστερήσεις (after, before, with). Το AnimatorSet υποστηρίζει ένθεση — το AnimatorSet μπορεί να περιέχει άλλα AnimatorSet για σύνθετα σενάρια.

kotlin
import android.animation.AnimatorSet
import android.animation.ObjectAnimator

// AnimatorSet: σειριακή και παράλληλη κινούμενη εικόνα
val fadeIn = ObjectAnimator.ofFloat(myView, "alpha", 0f, 1f)
val slideUp = ObjectAnimator.ofFloat(myView, "translationY", 100f, 0f)
val bounce = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.1f, 1f)

val animatorSet = AnimatorSet().apply {
    // Παράλληλα: fadeIn + slideUp
    play(fadeIn).with(slideUp)
        "> Μετά: bounce με καθυστέρηση 200ms
    play(bounce).after(200L)

    duration = 400L
    interpolator = FastOutSlowInInterpolator()
    addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationEnd(animation: Animator) {
            Log.d("Anim", "Set completed")
        }
    })
    start()
}

AnimatorSet.Builder παρέχει fluent API για τη δημιουργία αλυσίδων: with() — παράλληλα, before() — πριν, after() — μετά. Το AnimatorSet υποστηρίζει cancel() για διακοπή όλων των κινούμενων εικόνων στο σύνολο. Για σύνθετα σενάρια (25+ animator) χρησιμοποιήστε PropertyValuesHolder — είναι πιο αποδοτικό επειδή χρησιμοποιεί έναν κοινό χρονοδιακόπτη αντί για ξεχωριστούς για κάθε Animator.

Μέθοδος BuilderΠεριγραφήΠαράδειγμα
with(Animator)Παράλληλη εκτέλεση με τρέχουσα κινούμενη εικόναplay(fadeIn).with(slideUp)
before(Animator)Τρέχουσα κινούμενη εικόνα πριν από την καθορισμένηplay(fadeIn).before(bounce)
after(Animator)Τρέχουσα κινούμενη εικόνα μετά την καθορισμένηplay(bounce).after(slideUp)
after(Long)Καθυστέρηση πριν από την τρέχουσα κινούμενη εικόναplay(bounce).after(200L)

Interpolator και TypeEvaluator: διαχείριση ταχύτητας και τύπου

Interpolator καθορίζει την καμπύλη αλλαγής ταχύτητας της κινούμενης εικόνας από 0 έως 1. Το Android παρέχει ενσωματωμένους Interpolator: LinearInterpolator (ομοιόμορφα), AccelerateDecelerateInterpolator (αργά-γρήγορα-αργά), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (με υπέρβαση στόχου), BounceInterpolator (με αναπήδηση), AnticipateOvershootInterpolator (με οπισθοχώρηση πριν την έναρξη και υπέρβαση στόχου). Προσαρμοσμένος Interpolator υλοποιείται μέσω TimeInterpolator.

kotlin
import android.animation.ObjectAnimator
import android.view.animation.BounceInterpolator
import android.view.animation.OvershootInterpolator
import android.view.animation.AnticipateOvershootInterpolator

// BounceInterpolator — εφέ αναπήδησης στο τέλος
val bounceAnim = ObjectAnimator.ofFloat(myView, "translationY", 0f, -50f).apply {
    duration = 600L
    interpolator = BounceInterpolator()
    start()
}

// AnticipateOvershoot — οπισθοχώρηση, στη συνέχεια υπέρβαση
val anticipateAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.3f).apply {
    duration = 500L
    interpolator = AnticipateOvershootInterpolator(2.0f)
    start()
}

TypeEvaluator — διεπαφή με μέθοδο evaluate(fraction, startValue, endValue) που υπολογίζει την ενδιάμεση τιμή μεταξύ start και end. Ενσωματωμένοι: ArgbEvaluator (χρώμα int), FloatEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator. Για προσαρμοσμένους τύπους δεδομένων (π.χ. κινούμενη εικόνα προσαρμοσμένης κλάσης με τρία πεδία) υλοποιήστε τον δικό σας TypeEvaluator. Για κινούμενη εικόνα πολλαπλών View με ίδιες ρυθμίσεις χρησιμοποιήστε PropertyValuesHolder — δέχεται πίνακα ονομάτων ιδιοτήτων και αντίστοιχων τιμών.

kotlin
// Προσαρμοσμένος TypeEvaluator για την κλάση ProgressState
data class ProgressState(val progress: Float, val color: Int)

class ProgressEvaluator : TypeEvaluator<ProgressState> {
    override fun evaluate(
        fraction: Float,
        startValue: ProgressState,
        endValue: ProgressState
    ): ProgressState {
        val progress = startValue.progress + fraction * (endValue.progress - startValue.progress)
        val color = ArgbEvaluator().evaluate(
            fraction, startValue.color, endValue.color
        ) as Int
        return ProgressState(progress, color)
    }
}

"> PropertyValuesHolder — μέγιστη απόδοση
val pvh1 = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.5f)
val pvh2 = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.5f)
val pvhAnim = ObjectAnimator.ofPropertyValuesHolder(myView, pvh1, pvh2).apply {
    duration = 300L
    start()
}

Συχνές Ερωτήσεις

Σε τι διαφέρει το Property Animation από το View Animation;

View Animation (Tween Animation) αλλάζει μόνο την οπτική αναπαράσταση του View μέσω matrix transform, χωρίς να επηρεάζει τις πραγματικές ιδιότητες του αντικειμένου. Μετά την κινούμενη εικόνα translationX στο View Animation, το στοιχείο είναι οπτικά μετατοπισμένο, αλλά τα κλικ επεξεργάζονται στην αρχική θέση. Το Property Animation (ObjectAnimator) αλλάζει την πραγματική ιδιότητα — μετά την κινούμενη εικόνα, το στοιχείο βρίσκεται φυσικά στη νέα θέση.

Πώς σταματάω το Property Animation;

Καλέστε animator.cancel() — η κινούμενη εικόνα σταματά αμέσως, η τελική τιμή δεν εφαρμόζεται. Κλήση animator.end() — η κινούμενη εικόνα μεταβαίνει στην τελική κατάσταση και σταματά. Για AnimatorSet — set.cancel() σταματά όλες τις κινούμενες εικόνες στο σύνολο. Τα Animator.pause() και resume() είναι διαθέσιμα σε API 19+ για προσωρινή παύση.

Ποιο Interpolator να χρησιμοποιήσω για διαφορετικούς τύπους κινούμενης εικόνας;

Το Material Design συνιστά: FastOutSlowInInterpolator — για εμφάνιση και εξαφάνιση στοιχείων, LinearInterpolator — για δείκτες φόρτωσης, OvershootInterpolator — για εφέ έμφασης (κουμπιά), BounceInterpolator — για pull-to-refresh και ελαστικά στοιχεία. Για κινούμενη εικόνα εμφάνισης από την άκρη της οθόνης χρησιμοποιήστε AccelerateDecelerateInterpolator.

Γιατί το ObjectAnimator δεν κινεί την ιδιότητα;

Ελέγξτε: (1) το αντικείμενο έχει δημόσιο setter για την καθορισμένη ιδιότητα (setPropertyName()), (2) η ιδιότητα είναι γραμμένη σε camelCase με μικρό γράμμα μετά το «set», (3) ο setter δέχεται τον ίδιο τύπο που μεταδίδετε (ofFloat → setPropertyName(float)). Για View, όλες οι τυπικές ιδιότητες (alpha, translationX, rotation κ.λπ.) έχουν setter.

Πότε να χρησιμοποιώ ObjectAnimator αντί για ValueAnimator;

ObjectAnimator — όταν κινείτε μία τυπική ιδιότητα View (alpha, translationX, rotation). ValueAnimator — όταν χρειάζεται να ενημερώσετε πολλές ιδιότητες από έναν ακροατή, να κινήσετε μη-View ιδιότητες (πρόοδος, προσαρμοσμένη σχεδίαση), ή όταν το αντικείμενο δεν έχει setter για την επιθυμητή ιδιότητα. Το ValueAnimator είναι πιο ευέλικτο, αλλά απαιτεί περισσότερο κώδικα για μη αυτόματη ενημέρωση.

Σύνοψη

  • Property Animation — πλαίσιο Android για κινούμενη εικόνα πραγματικών ιδιοτήτων αντικειμένων μέσω Animator.
  • ObjectAnimator — κινούμενη εικόνα συγκεκριμένης ιδιότητας αντικειμένου με καθορισμένες start/end τιμές.
  • ValueAnimator — παραγωγή κινούμενων τιμών με μη αυτόματη ενημέρωση στο onAnimationUpdate.
  • AnimatorSet — ενορχήστρωση πολλών animator σειριακά ή παράλληλα.
  • Interpolator — καμπύλη ταχύτητας: FastOutSlowIn, Linear, Bounce, Overshoot, προσαρμοσμένοι.
  • TypeEvaluator — κανόνας παρεμβολής μεταξύ τιμών για προσαρμοσμένους τύπους δεδομένων.
  • Property Values Holder (PropertyValuesHolder) — βελτιστοποίηση για παράλληλη κινούμενη εικόνα πολλαπλών ιδιοτήτων.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης