Анимация

Cell-анимация

Последнее обновление: 18.10.2021

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 в Android и Java

Анимация определяется с помощью корневого элемента 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().

Анимация фреймов AnimationDrawable в Android и Java

Стоит отметить, что метод start() объекта AnimationDrawable не вызывается напрямую из onCreate() класса MainActivity, так как при выполнении метода onCreate() объект AnimationDrawable еще полностью не определен. Поэтому в данном случае анимация запускается именно при нажатии на ImageIview, когда приложение видимо на экране и взаимодействует с пользователем. Если же необходимо автоматически запустить анимацию при запуске приложения, то можно это делать в методе onStart() класса Activity.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850