活动转换滑动进出动画

5
我知道互联网上有一些例子,也在Stackoverflow上找到了许多例子,但信不信由你,它们中没有一个能满足我的需求。即使我之前问过类似的问题,我再次陷入了这个问题。基本上是同样的问题,但方向相反。我可以用Activity B做任何动画,但问题在于Activity A,我只能在几种情况下对其进行动画处理。基本上,ActivityA只在以下组合中播放enter_left:

overridePendingTransition(R.anim.enter_from_right, R.anim.exit_on_left);

我想做的是在startActivity()onBackPressed()时仅动画移动Activity A,而Activity B保持不动。Activity A始终会被绘制在顶部(就像一个滑动菜单,我可以用Activity B实现这个目的)。我真的以为上面的片段能解决问题:

Intent intent = new Intent(ActivityA.this, ActivityB.class);
                startActivityForResult(intent, 500);
                overridePendingTransition(R.anim.stay_still, R.anim.exit_on_left);

但是这甚至没有播放任何动画,而且。
//this is the animation for onBackPressed()
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        overridePendingTransition(R.anim.enter_from_left, 0);
    }

我想要对Activity A进行动画处理,但是Activity B突然从屏幕上消失了,而我希望它保持在原位(设置(R.anim.enter_from_left, R.anim.stay_still)并没有作用)。

我已经准备好了所有5种必要的动画:

enter_from_left

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >

<translate
    android:duration="500"
    android:fromXDelta="-100%"
    android:toXDelta="0%" />
</set>

exit_on_left

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >

<translate
    android:duration="500"
    android:fromXDelta="0%"
    android:toXDelta="-100%" />
</set>

从右侧进入

    <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <translate
        android:duration="500"
        android:fromXDelta="100%"
        android:toXDelta="0%" />
   </set>

退出右侧。
    <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <translate
        android:duration="500"
        android:fromXDelta="0%"
        android:toXDelta="100%" />
   </set>

保持静止

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <translate
        android:duration="500"
        android:fromXDelta="0%"
        android:toXDelta="0%" />
</set>

我尝试了很多组合,但都没有成功。您能告诉我这种动画是否可能,并且能否用这种方式实现吗? 我会发布一张图片,更清楚地表达我的意思:
第一步:在startActivity()上,ActivityA应该从左侧离开屏幕,同时移动时,ActivityB应该已经“在那里”,“在它下面”。
然后,在onBackPressed()中,Acyivity B应该从屏幕的左侧“返回”,并重叠保持不动的ActivityB。
图片链接:https://istack.dev59.com/ibfMM.webp 和 https://istack.dev59.com/9uKsE.webp
5个回答

0

5年后,这个问题终于有了解决方案。 这两个函数需要在活动中实现,以覆盖默认的转换。

@Override
public void startActivity(Intent intent) {
    super.startActivity(intent);
    overridePendingTransition(R.anim.from_right_in, R.anim.from_left_out);
}

@Override
public void startActivityForResult(Intent intent, int requestCode) {
    super.startActivityForResult(intent, requestCode);
    overridePendingTransition(R.anim.from_right_in, R.anim.from_left_out);
}

from_right_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0" android:interpolator="@android:interpolator/accelerate_decelerate" android:duration="300"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
</set>

from_left_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="300"/>
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" />
</set>

0

试一下

  1. 为活动的进出添加动画效果,在意图调用中使用以下代码:

    startActivity(new Intent(this,toActivity));
    overridePendingTransition( R.anim.slide_in, R.anim.slide_out);
    
  2. 这是动画文件,请将其添加到anim文件夹中

    slide_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromYDelta="100%p" android:toYDelta="0%p"
        android:duration="300"/>
    

    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:fromYDelta="0%p"
        android:toYDelta="100%p" />
    

谢谢


0

不确定您是否尝试过这种组合,但应该可以工作。

startActivityForResult(intent, 500);
overridePendingTransition(R.anim.enter_from_left, R.anim.stay_still);

这将使Activity B从左侧进入,而Activity A保持不变。第一个参数是进入(新创建)活动的动画。 - AlexAndro

0

我发现下面这个代码片段在使用fragment时非常好用:fragmentTransaction.setCustomAnimations(R.anim.stay_still,R.anim.exit_on_left);
overridePendingTransition(R.anim.stay_still, R.anim.exit_on_left);则不能在activity中使用。

另一方面,反过来也是如此:

overridePendingTransition(R.anim.enter_from_left, 0); 或者 fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, 0);

都不能在activity或fragment中使用。最接近可行的方法是 transaction.setCustomAnimations(R.anim.stay_still,R.anim.exit_on_left, R.anim.enter_from_left,R.anim.exit_on_right);

如果有其他解决方案,欢迎分享,感激不尽。


-1

我不确定我是否真正理解你想要什么,但如果你想创建一个滑动菜单,你可以使用这个教程来实现它,它完全可行 - 这是解决你问题的另一种选择 -:

http://developer.android.com/training/implementing-navigation/nav-drawer.html

但是你必须使用FragmentActivity而不是Activity。如果你需要一个例子,只需请求我,我会发布它。祝你好运。


不,我不想要这个,因为我有一系列需要共享此动画的活动。这不应该是一个滑动菜单。 - AlexAndro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接