0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Итак, в данном уроке я расскажу о том, как делать простейшую анимацию летающей кнопки Floating Action Button.</p>
1
<p>Итак, в данном уроке я расскажу о том, как делать простейшую анимацию летающей кнопки Floating Action Button.</p>
2
<p>Первым делом создайте новое приложение в<strong>Android Studio</strong>с пустым активити (Empty Activity).</p>
2
<p>Первым делом создайте новое приложение в<strong>Android Studio</strong>с пустым активити (Empty Activity).</p>
3
<p>Для работы с<strong>Floating Action Button</strong>в Android Studio необходимо подключить библиотеку Design. Чтобы это сделать нужно перейти в<strong>Gradle Scripts -> build.gradle (Modul: app)</strong>. В<strong>build.gradle (Modul: app)</strong>в раздел<strong>dependencies</strong>добавьте такую строчку:</p>
3
<p>Для работы с<strong>Floating Action Button</strong>в Android Studio необходимо подключить библиотеку Design. Чтобы это сделать нужно перейти в<strong>Gradle Scripts -> build.gradle (Modul: app)</strong>. В<strong>build.gradle (Modul: app)</strong>в раздел<strong>dependencies</strong>добавьте такую строчку:</p>
4
compile ‘com.android.support:design:25.3.1’<p>После чего нужно синхронизировать проект, нажав на ссылку<strong>Sync Now</strong>в верхнем правом углу. Теперь можно приступать к созданию летающей кнопки. Первым делом, перейдите к представлению<strong>MainActivity</strong>, т.е. к файлу<em>activity_main.xml</em>, который расположен в<em>app -> res -> layuot</em>, и отредактируйте его содержимое следующим образом:</p>
4
compile ‘com.android.support:design:25.3.1’<p>После чего нужно синхронизировать проект, нажав на ссылку<strong>Sync Now</strong>в верхнем правом углу. Теперь можно приступать к созданию летающей кнопки. Первым делом, перейдите к представлению<strong>MainActivity</strong>, т.е. к файлу<em>activity_main.xml</em>, который расположен в<em>app -> res -> layuot</em>, и отредактируйте его содержимое следующим образом:</p>
5
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="ru.lessons.fabanimation.MainActivity"> <android.support.design.widget.FloatingActionButton android:id="@+id/fabHideFab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:layout_margin="20dp" app:backgroundTint="#9ACD32" app:borderWidth="5dp" app:elevation="10dp" app:fabSize="normal" app:srcCompat="@android:drawable/ic_menu_camera"/> <Button android:id="@+id/btnShowFab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|left" android:layout_margin="20dp" android:text="SHOW FAB"/> </android.support.design.widget.CoordinatorLayout><p>В примере мы будем использовать две кнопки. Первая кнопка -<strong>Floating Action Button</strong>, при нажатии на которую она будет плавно уменьшаться до тех пор, пока не исчезнет совсем. Вторая кнопка -<strong>Button</strong>, при нажатии на которую будет восстанавливаться видимость<strong>Floating Action Button</strong>. Чтобы кнопки заняли свои позиции внутри контейнера в соответствии со своими настройками, в качестве контейнера в<em>activity_main.xml</em>необходимо использовать<strong>CoordinatorLayout</strong>.</p>
5
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="ru.lessons.fabanimation.MainActivity"> <android.support.design.widget.FloatingActionButton android:id="@+id/fabHideFab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:layout_margin="20dp" app:backgroundTint="#9ACD32" app:borderWidth="5dp" app:elevation="10dp" app:fabSize="normal" app:srcCompat="@android:drawable/ic_menu_camera"/> <Button android:id="@+id/btnShowFab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|left" android:layout_margin="20dp" android:text="SHOW FAB"/> </android.support.design.widget.CoordinatorLayout><p>В примере мы будем использовать две кнопки. Первая кнопка -<strong>Floating Action Button</strong>, при нажатии на которую она будет плавно уменьшаться до тех пор, пока не исчезнет совсем. Вторая кнопка -<strong>Button</strong>, при нажатии на которую будет восстанавливаться видимость<strong>Floating Action Button</strong>. Чтобы кнопки заняли свои позиции внутри контейнера в соответствии со своими настройками, в качестве контейнера в<em>activity_main.xml</em>необходимо использовать<strong>CoordinatorLayout</strong>.</p>
6
<p>Далее нам нужно будет создать каталог для хранения файлов с настройками анимации. Для этого перейдём к каталогу ресурсов проекта<strong>app -> res</strong>и, нажав на нём правой кнопкой мыши, в появившемся меню выберем<strong>New -> Android resource directory</strong>. В открывшемся окне зададим наименование нового каталога. Назовём его<strong>anim</strong>. После создания каталога<strong>anim</strong>создадим в нём файл, отвечающий за скрытие кнопки<strong>Floating Action Button</strong>. Для этого нажмите правой кнопкой мыши на каталоге<strong>anim</strong>и в появившемся меню выберите<strong>New -> Animation resource file</strong>. Назовите его<strong>fab_hide</strong>.</p>
6
<p>Далее нам нужно будет создать каталог для хранения файлов с настройками анимации. Для этого перейдём к каталогу ресурсов проекта<strong>app -> res</strong>и, нажав на нём правой кнопкой мыши, в появившемся меню выберем<strong>New -> Android resource directory</strong>. В открывшемся окне зададим наименование нового каталога. Назовём его<strong>anim</strong>. После создания каталога<strong>anim</strong>создадим в нём файл, отвечающий за скрытие кнопки<strong>Floating Action Button</strong>. Для этого нажмите правой кнопкой мыши на каталоге<strong>anim</strong>и в появившемся меню выберите<strong>New -> Animation resource file</strong>. Назовите его<strong>fab_hide</strong>.</p>
7
<p>Отредактируйте его содержимое следующим образом:</p>
7
<p>Отредактируйте его содержимое следующим образом:</p>
8
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" android:duration="1000" android:shareInterpolator="true"> <scale android:fromXScale="1.0" android:fromYScale="1.0" android:toXScale="0.0" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" /> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" /> </set><p>Теперь аналогичным образом нужно создать ещё один файл, который будет отвечать за появление кнопки<strong>Floating Action Button</strong>. Назовите этот файл<strong>fab_show</strong>и отредактируйте его содержимое так:</p>
8
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" android:duration="1000" android:shareInterpolator="true"> <scale android:fromXScale="1.0" android:fromYScale="1.0" android:toXScale="0.0" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" /> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" /> </set><p>Теперь аналогичным образом нужно создать ещё один файл, который будет отвечать за появление кнопки<strong>Floating Action Button</strong>. Назовите этот файл<strong>fab_show</strong>и отредактируйте его содержимое так:</p>
9
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" android:duration="1000" android:shareInterpolator="true"> <scale android:fromXScale="0.0" android:fromYScale="0.0" android:toXScale="1.0" android:toYScale="1.0" android:pivotX="50%" android:pivotY="50%" /> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" /> </set><p><strong>fillAfter="true"</strong>означает, что преобразование будет выполнятся после завершения анимации.<strong>duration="1000″</strong>устанавливает время выполнения анимации в миллисекундах. В данной ситуации установлено 1000 миллисекунд, или 1 секунда.<strong>shareInterpolator="true"</strong>устанавливает возможность использования интерполятора всеми дочерними элементами. Элемент<strong>scale</strong>отвечает за изменение размера кнопки при анимации, где параметры f<strong>romXScale</strong>и<strong>fromYScale</strong>- это начальные значения масштабов кнопки по осям X и Y на момент начала анимации, а параметры<strong>toXScale</strong>и<strong>toYScale</strong>- это конечные значения масштабов на момент завершения анимации. Значения этих параметров имеют тип<strong>float</strong>и варьируются от 0 до 1. Значение 1.0 соответствует натуральному масштабу. Параметры<strong>pivotX</strong>и<strong>pivotY</strong>указывают на координату внутри кнопки, относительно которой происходит изменение размера кнопки. Т.е. эта координата становиться центром, относительно которого кнопка уменьшается при её скрытии, или увеличивается при её появлении. Элемент<strong>alpha</strong>отвечает за прозрачность кнопки, где значение 1.0 соответствует абсолютной непрозрачности, а 0.0 - абсолютной прозрачности. Параметр<strong>fromAlpha</strong>- это начальное значение прозрачности, а<strong>toAlpha</strong>- конечное значение прозрачности.</p>
9
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" android:duration="1000" android:shareInterpolator="true"> <scale android:fromXScale="0.0" android:fromYScale="0.0" android:toXScale="1.0" android:toYScale="1.0" android:pivotX="50%" android:pivotY="50%" /> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" /> </set><p><strong>fillAfter="true"</strong>означает, что преобразование будет выполнятся после завершения анимации.<strong>duration="1000″</strong>устанавливает время выполнения анимации в миллисекундах. В данной ситуации установлено 1000 миллисекунд, или 1 секунда.<strong>shareInterpolator="true"</strong>устанавливает возможность использования интерполятора всеми дочерними элементами. Элемент<strong>scale</strong>отвечает за изменение размера кнопки при анимации, где параметры f<strong>romXScale</strong>и<strong>fromYScale</strong>- это начальные значения масштабов кнопки по осям X и Y на момент начала анимации, а параметры<strong>toXScale</strong>и<strong>toYScale</strong>- это конечные значения масштабов на момент завершения анимации. Значения этих параметров имеют тип<strong>float</strong>и варьируются от 0 до 1. Значение 1.0 соответствует натуральному масштабу. Параметры<strong>pivotX</strong>и<strong>pivotY</strong>указывают на координату внутри кнопки, относительно которой происходит изменение размера кнопки. Т.е. эта координата становиться центром, относительно которого кнопка уменьшается при её скрытии, или увеличивается при её появлении. Элемент<strong>alpha</strong>отвечает за прозрачность кнопки, где значение 1.0 соответствует абсолютной непрозрачности, а 0.0 - абсолютной прозрачности. Параметр<strong>fromAlpha</strong>- это начальное значение прозрачности, а<strong>toAlpha</strong>- конечное значение прозрачности.</p>
10
<p>Теперь перейдите к<strong>MainActivity</strong>и отредактируйте его код следующим образом:</p>
10
<p>Теперь перейдите к<strong>MainActivity</strong>и отредактируйте его код следующим образом:</p>
11
package ru.lessons.fabanimation; import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; public class MainActivity extends AppCompatActivity { private FloatingActionButton fabHideFab; private Button btnShowFab; private Animation animShowFab, animHideFab; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //анимация animShowFab = AnimationUtils.loadAnimation(this, R.anim.fab_show); animHideFab = AnimationUtils.loadAnimation(this, R.anim.fab_hide); //летающая кнопка Floating Action Button fabHideFab = (FloatingActionButton) findViewById(R.id.fabHideFab); //вспомогательная кнопка btnShowFab = (Button) findViewById(R.id.btnShowFab); fabHideFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //анимация скрытия Floating Action Button fabHideFab.startAnimation(animHideFab); } }); btnShowFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //анимация появления Floating Action Button fabHideFab.startAnimation(animShowFab); } }); } }<p>Подробнее смотрите в<a>видеоролике</a>.</p>
11
package ru.lessons.fabanimation; import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; public class MainActivity extends AppCompatActivity { private FloatingActionButton fabHideFab; private Button btnShowFab; private Animation animShowFab, animHideFab; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //анимация animShowFab = AnimationUtils.loadAnimation(this, R.anim.fab_show); animHideFab = AnimationUtils.loadAnimation(this, R.anim.fab_hide); //летающая кнопка Floating Action Button fabHideFab = (FloatingActionButton) findViewById(R.id.fabHideFab); //вспомогательная кнопка btnShowFab = (Button) findViewById(R.id.btnShowFab); fabHideFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //анимация скрытия Floating Action Button fabHideFab.startAnimation(animHideFab); } }); btnShowFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //анимация появления Floating Action Button fabHideFab.startAnimation(animShowFab); } }); } }<p>Подробнее смотрите в<a>видеоролике</a>.</p>
12
12