使用共享元素转场后,活动只是闪烁。

3

你好,我正在开发一个应用程序,并使用共享元素过渡来动画化登录和注册活动上的一个imageview和两个textviews的进入和退出过渡,但我的问题是视图根本没有动画效果。相反,当我单击注册按钮时,注册活动会闪烁两次,并且没有动画发生。而且,注册活动中的图像失去了其形状,所以我不知道出了什么问题,因为我在两个活动中都给出了相同的转换名称,但问题仍然存在,因此我希望能得到一些帮助。

以下是我的styles.xml

<resources xmlns:tools="http://schemas.android.com/tools">

    <!-- Base application theme. -->
    <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:windowEnableSplitTouch">false</item>
        <item name="android:splitMotionEvents">false</item>

        <!-- Transition -->
        <item name="android:windowContentTransitions" tools:targetApi="21">true</item>
        <item name="android:windowEnterTransition" tools:targetApi="21">@android:transition/fade
        </item>
        <item name="android:windowExitTransition" tools:targetApi="21">@android:transition/fade
        </item>
        <item name="android:windowActivityTransitions">true</item>
        <item name="android:windowSharedElementEnterTransition" tools:targetApi="21">
            @android:transition/move
        </item>
        <item name="android:windowSharedElementExitTransition" tools:targetApi="21">
            @android:transition/move
        </item>
    </style>


</resources>

我的登录活动。
public void gotoregister(View view) {
        Intent intent = new Intent(LoginActivity.this,RegisterActivity.class);
        Pair[] pairs  = new Pair[3];
        pairs[0] = new Pair<View,String>(text_login,getResources().getString(R.string.login_text_transition));
        pairs[1] = new Pair<View,String>(login_page_curve,getResources().getString(R.string.transition_name_signup));
        pairs[2] = new Pair<View,String>(register_text,getResources().getString(R.string.register_text_transition));
        ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation
                (LoginActivity.this,pairs);
        startActivity(intent,optionsCompat.toBundle());
        finish();
        //overridePendingTransition(R.anim.bottom_up,R.anim.bottom_down);

    }

在样式中添加 <item name="android:windowDisablePreview">true</item>,希望能对您有所帮助。 - Hardik Vasani
@Hardik,我尝试使用了你的解决方案,但仍然无法正常工作。 - john
尝试下面的代码。 - Hardik Vasani
如果在您的应用程序或实际活动标记中设置hardwareAccelerated=false,将避免您的动画事务。 - ManOfWar
4个回答

1

这在我的代码中有效。

styles.xml

<!-- Base application theme. -->
    s<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- 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:windowDisablePreview">true</item>
    <item name="android:windowEnableSplitTouch">false</item>
    <item name="android:splitMotionEvents">false</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>
</style>

<style name="AppTheme.NoActionBarMain">
    <item name="windowActionBar">false</item>
    <item name="android:windowDisablePreview">true</item>
    <item name="windowNoTitle">true</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowEnableSplitTouch">false</item>
    <item name="android:splitMotionEvents">false</item>
    <item name="android:colorForeground">@color/foreground_material_light</item>
</style>

styles.xml(v21)

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowEnableSplitTouch">false</item>
    <item name="android:splitMotionEvents">false</item>
</style>

当我使用简单布局创建新项目时,转换效果可以正常工作,但是如果使用复杂布局,它就完全不起作用了,这就是为什么我感到困惑的原因。 - john
@john 如果在 manifest.xml 文件中出现了 android:hardwareAccelerated="true" 这一行,请从应用程序标记中删除该行。 - Hardik Vasani
仍然没有用。 - john
我的图层列表在动画过程中失去了形状,可能的原因是什么? - john
第二个问题是,在给出转换名称后,我的自定义图层列表现在失去了其形状。 - john

1
尝试这个。
View sharedView = splashLogo;
            String transitionName = getString(R.string.splash_logo_animate);
            if (Build.VERSION.SDK_INT >= 21) {
                ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(SplashscreenActivity.this, sharedView, transitionName);
                startActivity(i, options.toBundle());
                finishAfterTransition();
            }
            else {
                ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(SplashscreenActivity.this, sharedView, transitionName);
                ActivityCompat.startActivity(getApplicationContext(), i, options.toBundle());
                finish();
            }

还是一样的..但感谢您的时间和耐心。 - john
但是你能帮我吗?这个图层列表在尝试动画时实际上失去了它的形状。 - john
请参考以下链接,希望能对您有所帮助:https://dev59.com/vFoU5IYBdhLWcg3waWZ3 - Hardik Vasani
不好意思,我想问一下关于图层列表的问题,它有自定义形状,但在第二个活动中自定义形状失去了宽度。 - john
@john,请检查此链接(https://github.com/wasabeef/awesome-android-ui/blob/master/pages/Animation.md)。 - Hardik Vasani
让我们在聊天中继续这个讨论 - Hardik Vasani

0

你尝试在你的样式主题中使用过这些吗?

    <item name="android:windowContentTransitions">true</item>
    <item name="android:windowActivityTransitions">true</item>

0

我看到你在启动新的活动后完成了当前活动,并且这样做会使得进入和退出转换丢失。

尝试保持 LoginActivity 看看是否可行。


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