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 Developer Documentation (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). Οι τιμές δίνονται σε pixel, ποσοστά του γονέα ή ποσοστά του ίδιου του View. Για παράδειγμα, 100% σημαίνει 100% του πλάτους του View.
ScaleAnimation κλιμακώνει το View σε σχέση με το σημείο pivotX/pivotY. fromXScale=1.0, toXScale=2.0 διπλασιάζει το πλάτος. Η παράμετρος pivotType καθορίζει σε σχέση με τι υπολογίζεται το pivot: self, parent ή absolute. Η κλιμάκωση δεν αλλάζει τις πραγματικές διαστάσεις του View — μόνο την απόδοση.
RotateAnimation περιστρέφει το View γύρω από το σημείο pivot με γωνία από 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 ή το στοιχείο με AnimatedVisibility στο Jetpack Compose.
Καλέστε view.clearAnimation(). Αν η κίνηση ξεκίνησε με fillAfter=true, το View θα παραμείνει στην τελική κατάσταση. Για εξαναγκασμένη επιστροφή στην αρχική κατάσταση, καλέστε clearAnimation() και invalidate().
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης