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 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 — η πιο δημοφιλής κλάση Property Animation. Κληρονομεί από το ValueAnimator και καλεί αυτόματα τον setter της καθορισμένης ιδιότητας του αντικειμένου με κινούμενες τιμές. Για τη λειτουργία του ObjectAnimator απαιτείται το αντικείμενο να έχει δημόσιο setter για την ιδιότητα που κινείται (π.χ. setTranslationX(float) για την ιδιότητα «translationX»).
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.
// 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 — η βασική κλάση Property Animation που παράγει κινούμενες τιμές από start έως end σε καθορισμένο χρόνο. Σε αντίθεση με το ObjectAnimator, το ValueAnimator δεν είναι συνδεδεμένο σε αντικείμενο — απλά υπολογίζει τις ενδιάμεσες τιμές και ειδοποιεί μέσω ακροατή. Ο προγραμματιστής αποφασίζει τι θα κάνει με τις λαμβανόμενες τιμές: να ορίσει ιδιότητα View, να αλλάξει παράμετρο Drawable, να ενημερώσει προσαρμοσμένη σχεδίαση στο onDraw().
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 για κάθε ιδιότητα.
// 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 — ενορχηστρωτής που επιτρέπει την εκτέλεση πολλών Animator (ObjectAnimator, ValueAnimator) σε καθορισμένη σειρά: σειριακά (playSequentially), παράλληλα (playTogether), με καθυστερήσεις (after, before, with). Το AnimatorSet υποστηρίζει ένθεση — το AnimatorSet μπορεί να περιέχει άλλα AnimatorSet για σύνθετα σενάρια.
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 καθορίζει την καμπύλη αλλαγής ταχύτητας της κινούμενης εικόνας από 0 έως 1. Το Android παρέχει ενσωματωμένους Interpolator: LinearInterpolator (ομοιόμορφα), AccelerateDecelerateInterpolator (αργά-γρήγορα-αργά), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (με υπέρβαση στόχου), BounceInterpolator (με αναπήδηση), AnticipateOvershootInterpolator (με οπισθοχώρηση πριν την έναρξη και υπέρβαση στόχου). Προσαρμοσμένος Interpolator υλοποιείται μέσω TimeInterpolator.
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 — δέχεται πίνακα ονομάτων ιδιοτήτων και αντίστοιχων τιμών.
// Προσαρμοσμένος 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()
}
Συχνές Ερωτήσεις
View Animation (Tween Animation) αλλάζει μόνο την οπτική αναπαράσταση του View μέσω matrix transform, χωρίς να επηρεάζει τις πραγματικές ιδιότητες του αντικειμένου. Μετά την κινούμενη εικόνα translationX στο View Animation, το στοιχείο είναι οπτικά μετατοπισμένο, αλλά τα κλικ επεξεργάζονται στην αρχική θέση. Το Property Animation (ObjectAnimator) αλλάζει την πραγματική ιδιότητα — μετά την κινούμενη εικόνα, το στοιχείο βρίσκεται φυσικά στη νέα θέση.
Καλέστε animator.cancel() — η κινούμενη εικόνα σταματά αμέσως, η τελική τιμή δεν εφαρμόζεται. Κλήση animator.end() — η κινούμενη εικόνα μεταβαίνει στην τελική κατάσταση και σταματά. Για AnimatorSet — set.cancel() σταματά όλες τις κινούμενες εικόνες στο σύνολο. Τα Animator.pause() και resume() είναι διαθέσιμα σε API 19+ για προσωρινή παύση.
Το Material Design συνιστά: FastOutSlowInInterpolator — για εμφάνιση και εξαφάνιση στοιχείων, LinearInterpolator — για δείκτες φόρτωσης, OvershootInterpolator — για εφέ έμφασης (κουμπιά), BounceInterpolator — για pull-to-refresh και ελαστικά στοιχεία. Για κινούμενη εικόνα εμφάνισης από την άκρη της οθόνης χρησιμοποιήστε AccelerateDecelerateInterpolator.
Ελέγξτε: (1) το αντικείμενο έχει δημόσιο setter για την καθορισμένη ιδιότητα (setPropertyName()), (2) η ιδιότητα είναι γραμμένη σε camelCase με μικρό γράμμα μετά το «set», (3) ο setter δέχεται τον ίδιο τύπο που μεταδίδετε (ofFloat → setPropertyName(float)). Για View, όλες οι τυπικές ιδιότητες (alpha, translationX, rotation κ.λπ.) έχουν setter.
ObjectAnimator — όταν κινείτε μία τυπική ιδιότητα View (alpha, translationX, rotation). ValueAnimator — όταν χρειάζεται να ενημερώσετε πολλές ιδιότητες από έναν ακροατή, να κινήσετε μη-View ιδιότητες (πρόοδος, προσαρμοσμένη σχεδίαση), ή όταν το αντικείμενο δεν έχει setter για την επιθυμητή ιδιότητα. Το ValueAnimator είναι πιο ευέλικτο, αλλά απαιτεί περισσότερο κώδικα για μη αυτόματη ενημέρωση.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης