切换活动时如何添加过渡?

Posted

技术标签:

【中文标题】切换活动时如何添加过渡?【英文标题】:How to add a transition when switching activities? 【发布时间】:2019-03-06 18:16:19 【问题描述】:

我正在尝试构建一个应用程序,最终我设法实现了一个导航栏,该导航栏使用库 (https://github.com/ittianyu/BottomNavigationViewEx) 在活动之间切换。 一切正常,但是当它在活动之间切换时,动画非常糟糕。

我找到了一个教程,他们使用 overridePendingTransition() 添加动画,但由于某种原因,我不能在这里使用它。

我已经创建了 4 个动画: slideleft、slideleftout、slideright、sliderightout 并添加了变量 num 以跟踪当前选择的活动,并且我添加了一些 If 语句来检查每种情况下的动画它应该播放(至少那是我想要做的)。

我应该如何在这里实现这些动画?

package com.example.score3.Utils;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import android.view.MenuItem;

import com.example.score3.MainActivity;
import com.example.score3.R;
import com.example.score3.SecondActivity;
import com.example.score3.ThirdActivity;
import com.ittianyu.bottomnavigationviewex.BottomNavigationViewEx;

public class BottomNavigationViewHelper 

    private static final String TAG = "BottomNavigationViewH";

    static int num = 0;

    public static void setupBottomNavigationView(BottomNavigationViewEx bottomNavigationViewEx)
        Log.d(TAG, "setupBottomNavigationView: Setting up BNV");
        bottomNavigationViewEx.enableAnimation(false);
        bottomNavigationViewEx.enableItemShiftingMode(false);
        bottomNavigationViewEx.enableShiftingMode(false);
        bottomNavigationViewEx.setIconSize(30,30);
    

    public static void enableNavigation(final Context context, BottomNavigationViewEx view)
        view.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() 
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) 
                switch (menuItem.getItemId())
                    case R.id.ic_league:
                        Intent intent1 = new Intent(context, MainActivity.class);//ACTIVITY_NUM = 0;
                        context.startActivity(intent1);
                        if(num>0)

                        

                        num = 0;

                        break;
                    case R.id.ic_csgo:
                        Intent intent2 = new Intent(context, SecondActivity.class);//ACTIVITY_NUM = 1;
                        context.startActivity((intent2));

                        if (num==0) 

                         else 

                        

                        num = 1;
                        break;
                    case R.id.ic_starcraft2:
                        Intent intent3 = new Intent(context, ThirdActivity.class);//ACTIVITY_NUM = 2;
                        context.startActivity(intent3);
                        if (num<2)

                        
                        num = 2;
                        break;
                


                return false;
            
        );
    


【问题讨论】:

【参考方案1】:

你不能直接使用overridePendingTransition() in 因为它是来自Activity (reference here) 的方法。 要么你需要一个调用活动的引用才能像这样调用:

activity.overridePendingTransition(R.anim.enter, R.anim.exit);

如果您的最低 SDK 版本为 Build.VERSION_CODES.JELLY_BEAN,您也可以使用 Bundle 来提供动画。这种用法的文档是可用的here this method signature。

【讨论】:

【参考方案2】:

将这两个文件添加到 res/anim 文件夹中。

R.anim.fade_in

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

R.anim.fade_out

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

Java 代码

 // Check if we're running on Android 5.0 or higher
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
        //Swap with transition
        //start new activity here
    activity.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
     else 
        // Swap without transition
    

【讨论】:

您可以根据需要更改您的过渡,如滑入、滑出、向右滑、向左滑等

以上是关于切换活动时如何添加过渡?的主要内容,如果未能解决你的问题,请参考以下文章

基于 React 实现一个 Transition 过渡动画组件

一个活动和另一个活动之间的动画过渡[关闭]

如何在列表项上切换活动类?

切换 vue 的 css 过渡结束效果

切换时如何在javascript和css中转换为“隐藏”

vue怎么给路由切换时添加动画