overridePendingTransition用于平滑地进出滑动活动

时间:2013-12-19 20:11:20

标签: java android android-activity transition

我无法通过按下按钮来确定如何将活动滑入和滑出。我想要的是用户按下按钮然后屏幕滑动。我希望它的方式是第一个活动(带按钮的那个)向左滑动,而新的第二个活动从右边滑入。

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

所以第一个活动滑出错误的方向,下一个活动就会出现而不是滑动。我究竟做错了什么?我很难理解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()使得第一个活动向左滑动,这就是我想要的。但是,当第一个活动滑落时,它仍然只是显示黑色屏幕,而不是从右侧滑入第二个活动。

5 个答案:

答案 0 :(得分:18)

您只需在startActivity()来电之后覆盖动画,而不是覆盖onCreate()和新活动startActivity()中的动画。

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

对于你的第二个问题,我相信你的fromXDelta设置错误,-100%应该一直离开屏幕的左侧一侧,而不是正确,所以将此更改为100%应该修复它。

答案 1 :(得分:1)

不仅在enter_from_right动画中有一个错误,它应该有一个100%而不是-100%的fromXDelta,但即使在enter_from_left动画中,也应该有一个fromXDelta为-100%而不是100%。

干杯,

答案 2 :(得分:1)

看看我的要点,它完美无缺:

1.Override 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 :(得分:0)

在您的代码中将fromXDelta-100%改为enter_from_left并从fromXDelta改为100%,这将为您提供正确的滑动动画。

答案 4 :(得分:0)

不要忘记此时的关键! fE。从上移到下。 ivotY是Meen底部的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>