Подтвердить что ты не робот

Как применить слайд-анимацию между двумя действиями в Android?

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

В Java оба файла:

super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);

Два файла в каталоге res/anim:

fadein.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/slide_out_right"
    android:toAlpha="1.0" >
</alpha>

fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/slide_in_left"
    android:toAlpha="1.0" >
</alpha>
4b9b3361

Ответ 1

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);

         new Handler().postDelayed(new Runnable() {
             public void run() {

                     /* Create an intent that will start the main activity. */
                     Intent mainIntent = new Intent(SplashScreen.this,
                             ConnectedActivity.class);
                     mainIntent.putExtra("id", "1");

                     //SplashScreen.this.startActivity(mainIntent);
                     startActivity(mainIntent);
                     /* Finish splash activity so user cant go back to it. */
                     SplashScreen.this.finish();

                     /* Apply our splash exit (fade out) and main
                        entry (fade in) animation transitions. */
                     overridePendingTransition(R.anim.mainfadein,R.anim.splashfadeout);
             }
     }, SPLASH_DISPLAY_TIME);   
    }

Ответ 2

Добавьте эти два файла в папку res/anim.

slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
   xmlns:android="http://schemas.android.com/apk/res/android" 
   android:duration="@android:integer/config_longAnimTime" 
   android:fromXDelta="100%p" 
   android:toXDelta="0%p"/>

slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
   xmlns:android="http://schemas.android.com/apk/res/android" 
   android:duration="@android:integer/config_longAnimTime" 
   android:fromXDelta="0%p" 
   android:toXDelta="-100%p"/>

И напишите следующий код в методе onCreate() следующего действия, которое вы передаете через Intent.

overridePendingTransition(R.anim.slide_in, R.anim.slide_out);

Ответ 3

enter image description here

Вы можете перезаписать анимацию активности по умолчанию, и она будет работать лучше, чем overridePendingTransition. Я использую это решение, которое работает для каждой версии Android. Просто скопируйте вставьте 4 файла и добавьте стиль из 4 линий, как показано ниже:

Создайте "CustomActivityAnimation" и добавьте его в свою базовую тему с помощью "windowAnimationStyle".

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

Затем создайте папку anim в папке res и затем создайте эти четыре файла анимации в папке anim:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

Если у вас возникнут какие-либо проблемы, вы можете скачать мой пример проекта с github.

Спасибо

Ответ 4

Слайд вверх/вниз с альфа-анимацией с несколькими нотами

enter image description here

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    >
    <translate
        android:fromYDelta="100%p"
        android:toYDelta="0"/>
    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1"/>
</set>

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    >
    <translate
        android:fromYDelta="0"
        android:toYDelta="100%p"/>
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0.5"/>
</set>

no_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    android:fromYDelta="0"
    android:toYDelta="0"/>

Первое занятие

startActivity(new Intent(this, SecondActivity.class));
overridePendingTransition(R.anim.slide_up,  R.anim.no_animation); // remember to put it after startActivity, if you put it to above, animation will not working
// document say if we don't want animation we can put 0. However, if we put 0 instead of R.anim.no_animation, the exist activity will become black when animate

Вторая деятельность

finish();
overridePendingTransition(R.anim.no_animation, R.anim.slide_down);

Готово

БОЛЬШЕ
Я пытаюсь сделать слайд-анимацию, например, анимацию iOS, когда представляю модель представления (например, https://www.youtube.com/watch?v=deZobvh2064), но не получилось.

Посмотрев на представленную в iOS анимацию, вы увидите: анимация снизу с альфа-каналом (около 50%), затем она идет очень быстро, а затем медленнее, время анимации составляет около> 500 мс (я использую инструменты обрезки видео для подсчета времени анимации https://www.kapwing.com/trim-video так что точно не могу на 100%)

Тогда я пытаюсь обратиться к Android.
Для создания альфы я использую <alpha> и успех.
Чтобы анимация запускалась быстрее, чем медленнее, я использую android:interpolator="a decelerate interpolator" но он почти не работает.

В Android есть 3 decelerate interpolator умолчанию
@android:interpolator/decelerate_quad → factor = 1
@android:interpolator/decelerate_cubic → factor = 1.5
@android:interpolator/decelerate_quint _> factor = 2.5
(более высокий коэффициент <=> анимация запускается быстрее от начала и медленнее в конце)
Вот хороший учебник http://cogitolearning.co.uk/2013/10/android-animations-tutorial-5-more-on-interpolators/ для его понимания

Я попробовал 3 выше, я не могу достичь, как iOS, анимация не может запускаться быстрее, как iOS. Затем я создаю пользовательский метод decelerateInterpolator с коэффициентом = 3, например

<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:factor="3" />

и я увеличиваю продолжительность с 500 → 750. Работает хорошо (очень похоже на iOS). Тем не менее, это работает только на некоторых устройствах, на некоторых устройствах анимация довольно медленная. Позже я знаю, что анимация может отличаться на разных устройствах (например, некоторые устройства будут работать быстрее, а некоторые - медленнее), поэтому я не могу сделать анимацию похожей на всех устройствах Android. Поэтому я не использую interpolator. Я не знаю, 100% ли у меня тестирование или нет, но я надеюсь, что этот опыт поможет

Ответ 5

Вы можете использовать overridePendingTransition в startActivity вместо onCreate. По крайней мере, это работает для меня!

Смотрите полный пример здесь. Он включает (обратную) анимацию onBackPressed, поэтому, возвращаясь к предыдущему действию! В вашем конкретном примере (fade-in и -out), который может быть ненужным, хотя.

Ответ 6

Слайд-анимация может быть применена к переходам активности, вызывая overridePendingTransition и передавая ресурсы анимации для действий входа и выхода.

Слайд анимации можно перемещать вправо, скользить влево, скользить вверх и вниз.

Скользить вверх

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">
    <scale
        android:duration="800"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="1.0"
        android:toYScale="0.0" />
</set>

Скользить вниз

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">
    <scale
        android:duration="800"
        android:fromXScale="1.0"
        android:fromYScale="0.0"
        android:toXScale="1.0"
        android:toYScale="1.0" />
</set>

overridePendingTransition (R.anim.slide_down, R.anim.slide_up);

Посмотрите примеры анимации перехода активности для большего количества примеров перехода активности.

Ответ 7

Пример Kotlin:

 private val SPLASH_DELAY: Long = 1000
    internal val mRunnable: Runnable = Runnable {
        if (!isFinishing) {
            val intent = Intent(applicationContext, HomeActivity::class.java)
            startActivity(intent)
            overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
            finish()
        }
    }


   private fun navigateToHomeScreen() {
        //Initialize the Handler
        mDelayHandler = Handler()

        //Navigate with delay
        mDelayHandler!!.postDelayed(mRunnable, SPLASH_DELAY)

    }

    public override fun onDestroy() {

        if (mDelayHandler != null) {
            mDelayHandler!!.removeCallbacks(mRunnable)
        }

        super.onDestroy()
    }

поместите анимацию в папку anim:

slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_longAnimTime"
        android:fromXDelta="100%p"
        android:toXDelta="0%p">
</translate>

slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_longAnimTime"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p">
</translate>

ИСПОЛЬЗОВАНИЕ

  navigateToHomeScreen();

Ответ 8

Вот слайд анимация для вас.

enter image description here

Допустим, у вас есть два вида деятельности.

  1. MovieDetailActivity
  2. AllCastActivity

И при нажатии кнопки это происходит.

enter image description here

Вы можете достичь этого в 3 простых шага

1) Включить переход контента

Перейдите в свой style.xml и добавьте эту строку, чтобы включить переход содержимого.

<item name="android:windowContentTransitions">true</item>

2) Написать переход по умолчанию для входа и выхода для AllCastActivity

public void setAnimation()
{
    if(Build.VERSION.SDK_INT>20) {
        Slide slide = new Slide();
        slide.setSlideEdge(Gravity.LEFT);
        slide.setDuration(400);
        slide.setInterpolator(new AccelerateDecelerateInterpolator());
        getWindow().setExitTransition(slide);
        getWindow().setEnterTransition(slide);
    }
}

3) Начать деятельность с намерением

Запишите этот метод в Your MovieDetailActivity чтобы запустить AllCastActivity

public void startActivity(){

Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putStringArrayListExtra(MOVIE_LIST, movie.getImages());

  if(Build.VERSION.SDK_INT>20)
   {
       ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(BlankActivity.this);
       startActivity(i,options.toBundle());
   }
   else {
       startActivity(i);
   }
}

Самое важное!

поместите ваш setAnimation() перед методом setContentView() иначе анимация не будет работать.
Таким образом, ваш AllCastActivity.java должен выглядеть следующим образом

 class AllCastActivity extends AppcompatActivity {

   @Override
   protected void onCreate(Bundle savedInstaceState)
   {
      super.onCreate(savedInstaceState);

      setAnimation();

      setContentView(R.layout.all_cast_activity);

      .......
   }

   private void setAnimation(){

      if(Build.VERSION.SDK_INT>20) {
      Slide slide = new Slide();
      slide.setSlideEdge(Gravity.LEFT);
      ..........
  }
}