Увидев переходы между окнами на iPhone решил сделать что-нибудь такое на Android.
В этой статье расскажу и покажу как сделать анимированные переходы между окнами на Android.
Будут рассмотрены diagonal, zoom, slide-переходы. Все что будет показано в этой статье проверено на Android 2.1 и выше.
Ну начнем.
Как всегда создаем наш проект. Сегодня назову его AndroidTransition.
Прежде всего нам надо добавить в папку res папку anim. Она нужна для наших будущих анимаций. Вот так будет выглядеть структура приложения:
Теперь создадим второе activity. ( в мое случае SecondActivity.java ) Надо же куда-то нам переходить из основного окна :). Для него создадим UI в новом second.xml файле.
Вот такие два файла получатся ( second.xml с некоторыми изменениями ):
SecondActivity.java
second.xml
Теперь изменим наш main.xml файл. Добавим в него 3 кнопки для наших переходов. Выглядеть он будет вот так:
main.xml
Сейчас можно приступить к написанию анимаций для переходов.
Начнем с diagonal-перехода. В нашей папке anim создаем 2 xml файла ( diagonal_in.xml и diagonal_out.xml ). Изменяем их так:
diagonal_in.xml
Теперь создадим ещё 2 файла: zoom_in.xml и zoom_out.xml. Они будут отвечать за zoom анимированный переход между окнами. Вот так мы их изменим:
zoom_in.xml
Добавим в папку anim ещё 4 файла которые будут отвечать за slide-анимацию. ( slide_left_in.xml, slide_left_out.xml, slide_right_in.xml, slide_right_out.xml )
slide_left_in.xml
Вот теперь все наши анимированные переходы готовы.
Можем приступить к изменению AndroidTransitionActivity.java и SecondActivity.java файлов.
Файл AndroidTransitionActivity.java изменим вот так:
AndroidTransitionActivity.java
Измененный SecondActivity.java файл теперь будет выглядеть вот так:
SecondActivity.java
Чуть не забыл про AndroidManifest.xml файл. Туда нам необходимо прописать наше добавленное activity ( SecondActivity.java ), иначе ничего работать не будет. Сделаем мы это вот так:
AndroidManifest.xml
Вот теперь все. После всех добавлений наше приложение имеет вот такую структуру:
Вот такие результаты получились:
Ну все. Мы достигли поставленной задачи и немного разобрались с анимированными переходами в Android. Теперь наши приложения будут выглядеть ещё красивее.
Надеюсь все, что здесь было показано, понятно.
В этой статье расскажу и покажу как сделать анимированные переходы между окнами на Android.
Будут рассмотрены diagonal, zoom, slide-переходы. Все что будет показано в этой статье проверено на Android 2.1 и выше.
Ну начнем.
Как всегда создаем наш проект. Сегодня назову его AndroidTransition.
Прежде всего нам надо добавить в папку res папку anim. Она нужна для наших будущих анимаций. Вот так будет выглядеть структура приложения:
Теперь создадим второе activity. ( в мое случае SecondActivity.java ) Надо же куда-то нам переходить из основного окна :). Для него создадим UI в новом second.xml файле.
Вот такие два файла получатся ( second.xml с некоторыми изменениями ):
SecondActivity.java
packagecom.lunevich.android;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;public classSecondActivityextendsActivity {@Overridepublic voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.second); } }
second.xml
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"android:background="@android:color/background_light"><Buttonandroid:id="@+id/btnBack"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="50px"android:text="BACK"/><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_margin="40px"android:text="Second View"android:textColor="@android:color/black"android:textAppearance="?android:attr/textAppearanceMedium"/></LinearLayout>
Теперь изменим наш main.xml файл. Добавим в него 3 кнопки для наших переходов. Выглядеть он будет вот так:
main.xml
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"android:background="#1B9EE0"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_margin="10px"android:text="@string/hello"android:textColor="@android:color/black"/><Buttonandroid:id="@+id/btnZoomTransition"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_margin="10px"android:text="Zoom Transition"/><Buttonandroid:id="@+id/btnSlideLeftTransition"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_margin="10px"android:text="Slide Left Transition"/><Buttonandroid:id="@+id/btnDiagonalTransition"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_margin="10px"android:text="Diagonal Transition"/></LinearLayout>
Сейчас можно приступить к написанию анимаций для переходов.
Начнем с diagonal-перехода. В нашей папке anim создаем 2 xml файла ( diagonal_in.xml и diagonal_out.xml ). Изменяем их так:
diagonal_in.xml
diagonal_out.xml<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="http://schemas.android.com/apk/res/android" ><translatexmlns:android="http://schemas.android.com/apk/res/android"android:duration="2000"android:fromXDelta="-100%"android:fromYDelta="-100%"android:toXDelta="0%"android:toYDelta="0%"/></set>
<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="http://schemas.android.com/apk/res/android" ><translatexmlns:android="http://schemas.android.com/apk/res/android"android:duration="2000"android:fromXDelta="0%"android:fromYDelta="0%"android:toXDelta="-100%"android:toYDelta="-100%"/></set>
Теперь создадим ещё 2 файла: zoom_in.xml и zoom_out.xml. Они будут отвечать за zoom анимированный переход между окнами. Вот так мы их изменим:
zoom_in.xml
zoom_out.xml<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="http://schemas.android.com/apk/res/android"><alphaandroid:duration="@android:integer/config_mediumAnimTime"android:fromAlpha="0.0"android:interpolator="@android:anim/accelerate_interpolator"android:toAlpha="1.0"/></set>
<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="http://schemas.android.com/apk/res/android"><alphaandroid:duration="@android:integer/config_mediumAnimTime"android:fromAlpha="1.0"android:interpolator="@android:anim/accelerate_interpolator"android:toAlpha="0.0"/></set>
Добавим в папку anim ещё 4 файла которые будут отвечать за slide-анимацию. ( slide_left_in.xml, slide_left_out.xml, slide_right_in.xml, slide_right_out.xml )
slide_left_in.xml
slide_left_out.xml<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="800"android:fromXDelta="100%p"android:toXDelta="0"/></set>
slide_right_in.xml<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="800"android:fromXDelta="0"android:toXDelta="-100%p"/></set>
slide_right_out.xml<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="800"android:fromXDelta="-100%p"android:toXDelta="0"/></set>
<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="800"android:fromXDelta="0"android:toXDelta="100%p"/></set>
Вот теперь все наши анимированные переходы готовы.
Можем приступить к изменению AndroidTransitionActivity.java и SecondActivity.java файлов.
Файл AndroidTransitionActivity.java изменим вот так:
AndroidTransitionActivity.java
packagecom.lunevich.android;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class AndroidTransitionActivity extends Activity implements OnClickListener { // Перечисление TransitionType создано только для демонстрации нескольких анимаций public static enum TransitionType { Zoom, SlideLeft, Diagonal } public static TransitionType transitionType; private Button btnZoomTransition; private Button btnSlideLeftTransition; private Button btnDiagonalTransition; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Регистрируем кнопки и вешаем на них обработчики нажатия btnZoomTransition = (Button)findViewById(R.id.btnZoomTransition); btnZoomTransition.setOnClickListener(this); btnSlideLeftTransition = (Button)findViewById(R.id.btnSlideLeftTransition); btnSlideLeftTransition.setOnClickListener(this); btnDiagonalTransition = (Button)findViewById(R.id.btnDiagonalTransition); btnDiagonalTransition.setOnClickListener(this); } public void onClick(View v) { // TODO Auto-generated method stub // Завершаем наше текущее activity this.finish(); // С помощью intent переходим во второе окно Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); switch (v.getId()) { case R.id.btnZoomTransition: // Устанавливаем тип нашей анимации transitionType = TransitionType.Zoom; // Для AndroidTransitionActivity указываем, // с помощью какой анимации мы будем переходить в другое окно overridePendingTransition(R.anim.zoom_in, R.anim.zoom_out); break; case R.id.btnSlideLeftTransition: transitionType = TransitionType.SlideLeft; overridePendingTransition(R.anim.slide_left_in, R.anim.slide_left_out); break; case R.id.btnDiagonalTransition: transitionType = TransitionType.Diagonal; overridePendingTransition(R.anim.diagonal_in, R.anim.diagonal_out); break; } } }
Измененный SecondActivity.java файл теперь будет выглядеть вот так:
SecondActivity.java
packagecom.lunevich.android;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;public classSecondActivityextendsActivityimplementsOnClickListener {privateButton btnBack;@Overridepublic voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.second);// Регистрируем нашу кнопку back и вешаем на неё обработчик нажатияbtnBack = (Button)findViewById(R.id.btnBack); btnBack.setOnClickListener(this); }public voidonClick(View v) {// TODO Auto-generated method stubswitch(v.getId()) {caseR.id.btnBack: onBackPressed();break; } }@Overridepublic voidonBackPressed() {// Завершаем наше activitythis.finish();// Intent отвечает за переходы между activity, // здесь мы возвращаемся обратно в наше главное окноIntent intent =newIntent(this, AndroidTransitionActivity.class); startActivity(intent);// Проверяем с помощью какой анимации мы перешли, по той же анимации и возвращаемсяif(AndroidTransitionActivity.transitionType == AndroidTransitionActivity.TransitionType.SlideLeft) {// Для SecondActivity устанавливаем анимацию переходаoverridePendingTransition(R.anim.slide_right_in, R.anim.slide_right_out); }else if(AndroidTransitionActivity.transitionType == AndroidTransitionActivity.TransitionType.Zoom) { overridePendingTransition(R.anim.zoom_in, R.anim.zoom_out); }else if(AndroidTransitionActivity.transitionType == AndroidTransitionActivity.TransitionType.Diagonal) { overridePendingTransition(R.anim.diagonal_in, R.anim.diagonal_out); } } }
Чуть не забыл про AndroidManifest.xml файл. Туда нам необходимо прописать наше добавленное activity ( SecondActivity.java ), иначе ничего работать не будет. Сделаем мы это вот так:
AndroidManifest.xml
//...<applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"><activityandroid:label="@string/app_name"android:name=".AndroidTransitionActivity"><intent-filter ><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter> </activity> <activityandroid:name="SecondActivity"></activity>// Вот эту строку добавили</application>//...
Вот теперь все. После всех добавлений наше приложение имеет вот такую структуру:
Вот такие результаты получились:
![]()  | 
| diagonal-анимация | 
![]()  | 
| zoom-анимация | 
![]()  | 
| slide-анимация | 
Ну все. Мы достигли поставленной задачи и немного разобрались с анимированными переходами в Android. Теперь наши приложения будут выглядеть ещё красивее.
Надеюсь все, что здесь было показано, понятно.





Этот комментарий был удален автором.
ОтветитьУдалитьЗдрасьте, а как сделать что бы переходил с фрагмента на активити с анимацией, а то ругается на эту строчку overridePendingTransition, заранее спасибо
ОтветитьУдалитьВот мое решение на ваш вопрос.
УдалитьПервый класс - содержащий фрагмент:
/**
* @author andrey_lunevich
*
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
MainFragment list = MainFragment.newInsatance();
getSupportFragmentManager().beginTransaction().add(android.R.id.content, list).commit();
}
}
public static class MainFragment extends Fragment implements OnClickListener {
public static MainFragment newInsatance() {
return new MainFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.main_fragment, container, false);
Button btn = (Button) v.findViewById(R.id.button1);
btn.setOnClickListener(this);
return v;
}
@Override
public void onClick(View v) {
getActivity().finish();
Intent intent = new Intent(getActivity(), SecondActivity.class);
startActivity(intent);
switch (v.getId()) {
case R.id.button1:
getActivity().overridePendingTransition(R.anim.slide_left_in, R.anim.slide_left_out);
break;
}
}
}
}
Второе активити в которое переходим из фрагмента:
/**
* @author andrey_lunevich
*
*/
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
}
}
Надеюсь ответил на ваш вопрос :)
Сделал в точности как написано. При нажатии кнопок анимации не происходит. Просто переключается активити. Что делать?
ОтветитьУдалитьМожете скинуть ваш шаблон ?
УдалитьАналогичная ситуация, компилировал под Android 2.3.3. Анимации не происходит.
УдалитьПроблема решилась у меня на Samsung (android 2.3.6) просто изменением в настройках самого устройства:
УдалитьSettings -> Display -> Animation
Настройки -> Дисплей -> Анимация
Ставим галочку вся анимация :)
Этот комментарий был удален автором.
ОтветитьУдалить