Cell animation или анимация фреймов представляет собой технику анимации, при которой ряд изображений или кадров/фреймов последовательно сменяют друг друга за короткий промежуток времени. Подобная техника довольно распространена при создании мультфильмов. Например, имеется следующий набор изображений:
При достаточно быстрой смене кадров получится динамический эффект зайца, забрасывающего мяч в баскетбольную корзину. Теперь рассмотрим, как сделать подобную анимацию в приложении Android.
Во-первых, нам надо добавить все эти изображения в проект в папку res/drawable. И в эту же папку добавим новый xml-файл. Назовем его rabit_animation.xml и поместим в него следующее содержимое:
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" > <item android:drawable="@drawable/a1" android:duration="250" /> <item android:drawable="@drawable/a2" android:duration="250" /> <item android:drawable="@drawable/a3" android:duration="250" /> <item android:drawable="@drawable/a4" android:duration="250" /> <item android:drawable="@drawable/a5" android:duration="250" /> <item android:drawable="@drawable/a6" android:duration="250" /> <item android:drawable="@drawable/a7" android:duration="250" /> </animation-list>
Анимация определяется с помощью корневого элемента animation-list, который содержит набор ключевых кадров в виде элементов item.
Свойство android:oneshot="false"
в определении корневого элемента указывает, что анимация будут продолжатся циклически. А при значении true
анимация срабатывала только один раз.
Каждый элемент аннимации устанавливает ссылку на ресурс изображения с помощью свойства android:drawable
, а также
с помощью свойства android:duration устанавливает время в миллисекундах, которое будет отображаться изображение.
В разметке интерфейса для отображения анимации используется элемент ImageView:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/animationView" android:layout_width="0dp" android:layout_height="0dp" android:adjustViewBounds="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout>
Далее изменим код MainActivity, чтобы запустить анимацию:
package com.example.animationapp; import androidx.appcompat.app.AppCompatActivity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView img = findViewById(R.id.animationView); // устанавливаем ресурс анимации img.setBackgroundResource(R.drawable.rabit_animation); // получаем объект анимации AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground(); // по нажатию на ImageView img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // запускаем анимацию frameAnimation.start(); } }); } }
С помощью метода setBackgroundResource() объекта ImageView устанавливается ресурс анимации. Затем из ImageView получаем собственно объект анимации AnimationDrawable и по нажатию на ImageView запускаем анимацию с помощью метода start().
Стоит отметить, что метод start()
объекта AnimationDrawable не вызывается напрямую из onCreate()
класса MainActivity, так как при выполнении метода onCreate()
объект AnimationDrawable еще полностью не определен.
Поэтому в данном случае анимация запускается именно при нажатии на ImageIview, когда приложение видимо на экране и взаимодействует с пользователем.
Если же необходимо автоматически запустить анимацию при запуске приложения, то можно это делать в методе onStart()
класса Activity.