overridePendingTransition 用于平滑地滑入和滑出活动

Posted

技术标签:

【中文标题】overridePendingTransition 用于平滑地滑入和滑出活动【英文标题】:overridePendingTransition for sliding activities in and out smoothly 【发布时间】:2014-01-08 13:21:44 【问题描述】:

我无法弄清楚如何通过按一下按钮将活动滑入和滑出。我想要的是用户按下按钮然后屏幕滑动。我想要的方式是让第一个活动(带有按钮的活动)向左滑出,而新的第二个活动从右侧滑入。

使用下面的代码,当单击按钮时,当我希望第一个活动向左滑出时,它会向右滑出。然后当它完成滑动时,剩下的只是一瞬间黑屏,然后第二个活动只是出现并且没有滑入。

所以第一个活动滑出不正确的方向,下一个活动只是出现而不是滑动。我究竟做错了什么?我很难理解 XML 文件,所以听到的是下面所有内容的代码。

第一次活动

@Override
public void onCreate(Bundle savedInstanceState) 

    playBtn.setOnClickListener(new OnClickListener() 
        public void onClick(View v) 
            Intent intent = new Intent(MainMenu.this, Levels.class);
            startActivity(intent);
            overridePendingTransition(R.anim.enter_from_right, R.anim.exit_out_left);
        
    );

第二次活动

@Override
public void onCreate(Bundle savedInstanceState) 
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.levels);

    overridePendingTransition(R.anim.enter_from_left, R.anim.exit_out_right);

所以我认为我的一些 XML 文件可能不正确。他们来了。

enter_from_left.xml

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

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

enter_from_right.xml

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

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

exit_out_left.xml

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

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

exit_out_right.xml

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

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

编辑 从第二个活动中删除overridePendingTransition() 使得第一个活动滑到左边,这就是我想要的。但是,当第一个活动滑开时,它仍然只是显示黑屏,而不是第二个活动从右侧滑入。

【问题讨论】:

你应该只需要覆盖一次动画,所以只有在推送新活动时。如果您从 onCreate 中删除覆盖,它应该可以工作 @panini 查看我的开篇文章的编辑。您帮助解决了一个问题。 我认为在您的 enter_from_right 动画中,您的 fromXDelta 应该是 100%,而不是 -100% 现在完美运行。请随意将此作为答案,以便我接受。 【参考方案1】:

您无需在startActivity() 和新活动onCreate() 中覆盖动画,只需在startActivity() 调用之后覆盖动画即可。

您为overridePendingTransition(int enterAnim, int exitAnim) 提供的两个ints 对应于两个动画——删除旧的Activity 并添加新的。

对于您的第二个问题,我相信您的 fromXDelta 设置错误,-100% 应该一直远离屏幕的左侧,而不是右侧,因此将其更改为100% 应该修复它。

【讨论】:

overridePendingTransition 有 enterAnim 作为第一个参数。 看看这里,一些可能很重要/有帮助的澄清:***.com/a/23752530/826946【参考方案2】:

看看我的要点,它工作得很好:

1.覆盖CommonActivity的startActivity并完成

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

    @Override
    public void finish() 
        super.finish();
        overridePendingTransition(R.anim.from_left_in, R.anim.from_right_out);
    

2.from_left_in.xml

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

3.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>

4.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>

5.from_right_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>

要点链接:https://gist.github.com/JagieChen/f5cc44bf663f3722bd19097be47ccf9b

【讨论】:

【参考方案3】:

不仅在 enter_from_right 动画中存在错误,它的 fromXDelta 应该是 100% 而不是 -100%,而且即使在 enter_from_left 动画中,也应该是 -100% 而不是 100% 的 fromXDelta。

干杯,

【讨论】:

【参考方案4】:

在您的代码中将fromXDeltaenter_from_leftfromXDelta 更改为100%enter_from_right 更改为100%,这将为您提供正确的滑动动画。

【讨论】:

【参考方案5】:

此时不要忘记支点! fE。从上到下移动。 pivotY 是 100% 的底部,所以你的 0% 在底部,而 -100% 在上升,你看不到它。将枢轴设置为边框时会更方便。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillAfter="true"
        android:shareInterpolator="false">
    <translate
            android:duration="800"
            android:fromYDelta="-100%"
            android:toYDelta="0%"
            android:interpolator="@android:anim/bounce_interpolator"
            android:pivotX="50%"
            android:pivotY="100%"/>
</set>

【讨论】:

以上是关于overridePendingTransition 用于平滑地滑入和滑出活动的主要内容,如果未能解决你的问题,请参考以下文章

窗体切换动画 overridePendingTransition

overridePendingTransition

overridePendingTransition

关于Activity切换动画(overridePendingTransition)的黑色背景问题

overridePendingTransition 用于平滑地滑入和滑出活动

activity启动动画overridePendingTransition()使用