在Android上的两个活动之间淡出效果

时间:2017-07-03 15:08:21

标签: android animation android-animation transition fade

我试图在我的启动画面活动结束时和/或我的主要活动开始时添加淡入淡出效果(理想情况下,主要活动会在启动画面完成后淡入,但我正在尝试任何操作)。我尝试了很多涉及动画和过渡的东西,但到目前为止它们都没有。正如你所看到的,我对动画并不熟悉,而且我知道我的问题可能来自于我对它缺乏了解。我一直在读很多但仍感到迷茫。

我想知道我的SplashActivity没有将布局设置为内容视图的事实是否会影响我的结果。我只使用启动画面活动的主题。以下是清单中的实现:

<activity
    android:name=".SplashActivity"
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

和主题(最初没有最后2项):

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/launch_logo</item>
    <item name="android:windowContentTransitions">true</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>

我还尝试在MainActivity中添加“淡入主题”:

<style name="AppTheme.FadeIn" parent="AppTheme" >
    <item name="android:windowNoTitle">true</item>
    <item name="android:activityOpenEnterAnimation">@anim/fade_in</item>
</style>

关于动画,我看到人们有时会使用:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <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="1000" />
</set>

而其他时间使用:

<?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="1000" />

所以我试过了两个......(可选问题:它们之间的区别是什么?)

在SplashActivity中,我尝试过:

Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getBaseContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
startActivity(intent, bundle);

还在MainActivity的onCreate函数中尝试了这个:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ViewGroup mRootView = (ViewGroup) findViewById(R.id.main_layout);
Fade mFade = new Fade(IN);
// Start recording changes to the view hierarchy
TransitionManager.beginDelayedTransition(mRootView, mFade);

ViewGroup mRootView = (ViewGroup) findViewById(R.id.main_layout);
mRootView.animate().alpha(0.0f); // at this point the view is totally transparent
mRootView.animate().alpha(1.0f).setDuration(2000); // here the view becomes 100% visible instantly, there is no animation

这是主要活动的布局:

<LinearLayout 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:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:weightSum="16"
    android:background="@color/background"
    android:animateLayoutChanges="true"
    tools:context=".MainActivity">
    ...

我在我的设置中检查过渡动画比例是否正确(我正在使用Android Studio的模拟器进行测试)。我的两项活动之间从未有过淡化效应。请有人赐教。

出于某种原因,当我这样做时,我会有某种淡化效果:

Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getBaseContext(),
                android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
startActivity(intent, bundle);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

我真的不明白。当然它变黑了然后主要活动的淡入效果正在起作用,但我不明白为什么它以这种方式工作。如果我删除一行它就会停止工作(当我忘记评论第二个startActivity命令时,我发现它正在以这种方式工作)。当我说我试图删除一行时,我也改变了这样的顺序:

Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getBaseContext(),
                android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent, bundle);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out); // with or without this line, this code doesn't work.
// I must have tried pretty much all combinations without any success...

我刚刚在这里发布了我在使用所有以前的解决方案失败后所做的事情(我已经分别尝试了)。当我想在打开下一个活动时获得淡入效果时,我在意图附加了一个布尔额外的附加内容。然后在开放活动的onCreate方法中,我有:

boolean fadeEffect = getIntent().getBooleanExtra("fade_in", false);
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.login_main_layout);
if(fadeEffect) {
    mainLayout.setAlpha(0.f);
    mainLayout.animate()
              .alpha(1.f)
              .setDuration(1000)
              .start();
}

如果有人需要帮助实施此类解决方案,我可以提供帮助。

2 个答案:

答案 0 :(得分:2)

将此选项包添加到您的startActivity方法中,以在两个活动之间进行淡入淡出动画:

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
        android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
        startActivity(intent, bundle);

无需添加任何其他代码即可完成您的要求! :)

答案 1 :(得分:0)

我在活动之间的动画方面遇到了类似的问题。

我知道你说你已经尝试了但是

Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
只要您没有与其他窗口动画混淆,

解决方案应该可以正常工作。也许通过使用某些可能的解决方案组合,它不能正常工作?尝试删除其他人并坚持使用此解决方案