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). Стойностите се задават в пиксели, проценти от родителя или проценти от самия 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също