Создаем простой переход между сценами
Главная » Создаем простой переход между сценами

Поработаем над переходами в Android приложениях. Переходы позволяют сделать пользовательский интерфейс более привлекательным, функциональным и стильным, что только в плюс любому приложению. С помощью переходов можно создавать анимацию изменений на пользовательском экране и легко контролировать  переходы в приложении от одних сцен к другим.

В данном уроке мы создадим приложение с простыми анимационными переходами. Коротко очертим объем предстоящей работы: нам нужно подготовить drawable ресурсы формата xml, layout файлы разметки интерфейса, ну и настроить сами анимационные переходы в Java. 

Создаем новое приложение, названия на ваше усмотрение, выбираем Blank Activity, минимальную версию Android выбираем 4.4

Теперь начнем с создания необходимых для нашей задачи графических элементов. Они будут содержаться, как уже было сказано, в xml файлах, которые нам нужно создать. Мы создадим четыре круга, заполненных различными цветовыми градиентами. 

Создаем в папке графических ресурсов drawable  файл circle1.xml. Создадим в этом файле круг, заполненный симпатичным градиентом:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:dither="true"
android:shape="oval">
<gradient
 android:endColor="#66ff0000"
 android:gradientRadius="150"
 android:startColor="#ffffcc00"
 android:type="radial"
 android:useLevel="false">
</gradient>

<size
 android:height="100dp"
 android:width="100dp">
</size>
</shape>

Как видите, мы создали шарик, заполненный заливкой. Все 4 используемых нами шарика будут иметь одинаковые параметры, кроме цвета заливки, чтобы мы могли их различать. Поэтому, берем наш код первого шарика за основу и в дальнейшем просто копируем его для новых форм, изменяя только цвет градиента. 

Создаем там же в drawable  еще один файл с именем circle2.xml. Его вид будет следующим:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:dither="true"
 android:shape="oval">
 <gradient
 android:endColor="#66ffcc00"
 android:gradientRadius="150"
 android:startColor="#ff00ff00"
 android:type="radial"
 android:useLevel="false">
 </gradient>
 <size
 android:height="100dp"
 android:width="100dp">
 </size>
</shape>

И еще один, circle3.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:dither="true"
 android:shape="oval">
 <gradient
 android:endColor="#6600ff00"
 android:gradientRadius="150"
 android:startColor="#ff0000ff"
 android:type="radial"
 android:useLevel="false">
 </gradient>
 <size
 android:height="100dp"
 android:width="100dp">
 </size>
</shape>

Ну и еще один, circle4.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:dither="true"
 android:shape="oval">
 <gradient
 android:endColor="#660000ff"
 android:gradientRadius="150"
 android:startColor="#ffff0000"
 android:type="radial"
 android:useLevel="false">
 </gradient>
 <size
 android:height="100dp"
 android:width="100dp">
 </size>
</shape>

Все, с кружками закончили. Переходим к следующему шагу. Теперь давайте определим парочку сцен, где будет выполняться переход между layout файлами. Поработаем с основным layout файлом, который мы создали при создании приложение (вспоминайте как называли свое main activity) у меня этот файл называется activity_main.xml. Открываем файл, переходим в режим редактирования Text и делаем наш файл таким:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity"
 android:background="#ff000000"
 android:id="@+id/bg">
</RelativeLayout>

Здесь ничего сложного, просто присваиваем этому layout ID и выставляем черный фон активности. Обратите внимание на ID, мы будем использовать его при создании переходов также и для другой сцены. Когда вы переходите между двумя сценами, Android будет анимировать изменения дольше, если в обе сцены имеют аналогичный ID, в противном случае мы не получим должного эффекта, а просто постепенное появление или исчезание разных объектов.

Теперь в файле activity_main.xml создадим для каждой созданной формы (circle1, circle2, circle3, circle4) свой элемент ImageButton

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity"
 android:background="#ff000000"
 android:id="@+id/bg">
 
 <ImageButton
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b1"
 android:src="@drawable/circle1"
 android:background="#00000000"
 android:contentDescription="shape"
 android:layout_alignParentLeft="true"
 android:layout_alignParentTop="true"
 android:onClick="changeScene"/>
 
 <ImageButton
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b2"
 android:src="@drawable/circle2"
 android:background="#00000000"
 android:contentDescription="shape"
 android:layout_alignParentRight="true"
 android:layout_alignParentTop="true"
 android:onClick="changeScene"/>
 
 <ImageButton
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b3"
 android:src="@drawable/circle3"
 android:background="#00000000"
 android:contentDescription="shape"
 android:layout_alignParentLeft="true"
 android:layout_alignParentBottom="true"
 android:onClick="changeScene"/>
 
 <ImageButton
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b4"
 android:src="@drawable/circle4"
 android:background="#00000000"
 android:contentDescription="shape"
 android:layout_alignParentRight="true"
 android:layout_alignParentBottom="true"
 android:onClick="changeScene"/>
 
</RelativeLayout>

Возьмем себе на заметку, что эти же ID созданных кнопок форм мы будем использовать в еще одном layout файле, который создадим позже. Также обратите внимание, что все кнопки имеют один и тот же метод для обработки нажатия: onClick="changeScene". Позже мы опишем процесс нажатия, который будет запускать анимационный переход при нажатии на любой из наших шариков. 

 Если в созданных шейпах вы не видите радиального градиента, хотя мы и задавали в настройках наших форм именно его, не расстраивайтесь - я его тоже не вижу:). Увидим уже в запущенном приложении.

Пока что наше творение выглядит так:

Activity вид

Первый файл layout, который мы создали, будет представлять начало перехода. Теперь создадим еще один файл layout, который будет использован как место, куда будет производиться переход. 

Добавляем в папку layout с файлами новый файл с именем end.xml. Добавим туда следующее:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#ff000000"
 android:id="@+id/bg"
 tools:context=".TransitionsActivity">

 <ImageButton
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b1"
 android:src="@drawable/circle1"
 android:background="#00000000"
 android:contentDescription="shape"
 android:layout_alignParentRight="true"
 android:layout_alignParentBottom="true"
 android:onClick="changeScene"/>

 <ImageButton
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b2"
 android:src="@drawable/circle2"
 android:background="#00000000"
 android:contentDescription="shape"
 android:layout_alignParentLeft="true"
 android:layout_alignParentBottom="true"
 android:onClick="changeScene"/>

 <ImageButton
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b3"
 android:src="@drawable/circle3"
 android:background="#00000000"
 android:contentDescription="shape"
 android:layout_alignParentRight="true"
 android:layout_alignParentTop="true"
 android:onClick="changeScene"/>

 <ImageButton
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b4"
 android:src="@drawable/circle4"
 android:background="#00000000"
 android:contentDescription="shape"
 android:layout_alignParentLeft="true"
 android:layout_alignParentTop="true"
 android:onClick="changeScene"/>

</RelativeLayout>

Как видите, код этого файла фактически повторяет activity_main.xml код, просто мы поменяли положение наших кругов. Суть перехода будет состоять в движении шариков по диагоналям из одного угла в другой.

Теперь переходим к самому интересному - настройке перехода.  Открываем Activity файл приложения (если оставляли имена по умолчанию, то это MainActivity, если не по умолчанию - вспоминайте как называли). Нам понадобиться импортировать сюда следующее:

import android.transition.AutoTransition;
import android.transition.Scene;
import android.transition.Transition;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.RelativeLayout;
import android.transition.TransitionManager;

Для создания перехода введем следующие переменные (до метода onCreate): 

//Сцены для перехода:
private Scene scene1, scene2;
//Переход для передвижения между сценами:
private Transition transition;
//Флажок для переключения между сценами:
private boolean start;

Готовимся к созданию перехода, который будет происходить при нажатии на любой из шариков. В методе onCreate добавляем следующее:

//Получаем layout ID
RelativeLayout FL=(RelativeLayout)findViewById(R.id.bg);
 
//Первая сцена
ViewGroup startView=(ViewGroup)getLayoutInflater().inflate(R.layout.activity_main,FL,false);
 
//Вторая сцена
ViewGroup stopView=(ViewGroup)getLayoutInflater().inflate(R.layout.end,FL,false);

Сначала мы определили ID базового файла layout, который привязываем и к первой, и к второй сцене. Дальше мы определяем 2 сцены, между которыми будет происходить переход. Этим мы хотим сказать устройству, что хотим сделать переход наших элементов в обоих сценах, обрабатывая каждый элемент с аналогичным ID как один и тот же объект, и это и будет обеспечивать создание анимационного эффекта перехода от одной сцены к другой.  

Теперь определим сцены, между которыми хотим сделать переход, тоже в методе onCreate: 

//Создание 2-х сцен
 scene1=new Scene(FL, startView);
 scene2=new Scene(FL,stopView);

Мы связали базовый layout и соответствующие layout наших сцен с конструкторами сцен, теперь мы сможем ссылаться на них при создании перехода. 

 Теперь создаем сам переход, опять же в теле метода onCreate:

 //Настраиваем переход и его свойства:
 transition = new AutoTransition();
 //Настраиваем длительность перехода 5 секунд:
 transition.setDuration(5000);
 transition.setInterpolator(new AccelerateDecelerateInterpolator());
 //Настраиваем запуск перехода:
 start=true;

В Android существует множество типов переходов, но мы используем авто переход AutoTransition, и Android сам подсчитает какие изменения нужно совершать, основываясь на свойствах сцен, которые будут изменяться при переходе (немного путано, система анализирует, что меняется при переходе в наших сценах и на базе этих наблюдений автоматически настраивает оптимальный для этого тип перехода, как то так).

Ну и осталось совсем немного, а именно описать наше нажатие на кнопки, ведь мы всем кнопкам задали атрибут onClick и для всех кнопок функция нажатия одна. 

 @TargetApi(Build.VERSION_CODES.KITKAT)
 public void changeScene(View view) {
 if (start) {
 TransitionManager.go(scene2,transition);
 start=false;
 }
 else {
 TransitionManager.go(scene1,transition);
 start=true;
 }
 }

Настраиваем TransitionManager для перехода от текущей сцены к другой, используя при этом логическую переменную, которая определяет на какой сцене мы сейчас находимся. Также здесь мы определили созданный ранее метод transition, который описывает процесс перехода.

Вот и все, остается только запустить и протестировать сие творение. В запущенном виде приложение представляет из себя черный фон с 4 шарами по углам, при нажатии на любой из который, начинается анимационный переход шариков из одного угла в другой по диагонали, довольно прикольно. Учитывайте, что тестировать это можно только на устройстве или эмуляторе с версией Android 4.4+.  Удачи!

Категория: Уроки программирования | Просмотров: 1193 | Добавил: Oleg | Теги: анимация в Android Studio, переходы | Рейтинг: 4.0/1
Всего комментариев: 0
avatar