活动转换无效

时间:2016-01-28 14:36:46

标签: android android-transitions

我正在尝试实现活动转换,但我无法看到效果。这是我第一次活动的代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_architecture);
        setUpWindowAnimations();
    }

private void setUpWindowAnimations() {
        if (android.os.Build.VERSION.SDK_INT >= 21) {
            Log.i("ANIM", "Fade called");
            Fade fade = new Fade(2);
            fade.setDuration(3000);
            getWindow().setExitTransition(fade);
        }
    }

以下是第二项活动的代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image);
        setUpWindowAnimations();
    }

private void setUpWindowAnimations() {
        if (android.os.Build.VERSION.SDK_INT >= 21) {
            Log.i("ANIM", "slide called");
            Slide slide = new Slide(Gravity.LEFT);
            slide.setDuration(3000);
            getWindow().setEnterTransition(slide);
        }
    }

即使我设置淡出动画,也没有淡入淡出,幻灯片也默认工作,即方向是BOTTOM而不是LEFT。

Here是我的values/style.xmlhere是我的v21/styles.xml

这是我的AndroidManifest.xml

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:theme="@style/AppTheme">

为什么这些过渡不起作用以及如何使它们起作用。我使用paste.ubuntu.com因为SO编辑器没有正确显示xml。

2 个答案:

答案 0 :(得分:39)

Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(this).toBundle();
this.startActivity(intent,bundle);

在两个活动之间设置意图后添加这两行, 这将有效。

您不能只通过startActivity(intent)方法开展活动, 您需要使用包指定跨活动的转换。

答案 1 :(得分:2)

setUpWindowAnimations();之前声明setContentView

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setUpWindowAnimations();
        setContentView(R.layout.activity_architecture);

    }

private void setUpWindowAnimations() {
        if (android.os.Build.VERSION.SDK_INT >= 21) {
            Log.i("ANIM", "Fade called");
            Fade fade = new Fade(2);
            fade.setDuration(3000);
            getWindow().setExitTransition(fade);
        }
    }

其他解决方案

制作一个xmlTransition并将此xml代码放在那里

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:interpolator="@android:interpolator/accelerate_decelerate">
    <fade android:fadingMode="fade_out"/>
    <slide android:slideEdge="bottom"/>
</transitionSet>

这应该是Api21

的样式
    <?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowContentTransitions">true</item>
        <item name="android:windowTransitionBackgroundFadeDuration">1000</item>
    </style>
</resources>

然后在setCreateView

之前将此代码放入您的活动中
if (Build.VERSION.SDK_INT >= 21) {

            TransitionInflater inflater = TransitionInflater.from(this);
            Transition transition = inflater.inflateTransition(R.transition.transition_a);
            getWindow().setExitTransition(transition);
        }

这应该在setCreateView

之前的其他活动中
if(Build.VERSION.SDK_INT >= 21){
            Slide slide = new Slide();
            slide.setDuration(1000);
            getWindow().setEnterTransition(slide);
        }