【Android】Activity切换动画效果

本文探讨了在Android中实现Activity切换动画的两种方法,包括通过`overridePendingTransition`代码方式和自定义theme方式。在手机动画关闭状态下,`overridePendingTransition`可能无效。在自定义theme中,`windowEnterAnimation`和`windowExitAnimation`是有效的。遇到的挑战包括错误提示和动画效果未显示,解决方案是使用正确的Theme和调整动画XML。此外,还提到了在动画库中实现布局元素位移的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结论:
overridePendingTransition代码方式在手机动画关闭的状态下是无效的;
自定义theme方式下,Animation.Activity的4个属性中,在动画关或者不关闭的状态下只有两个有效;(推荐使用)
windowEnterAnimation
windowExitAnimation
windowShowAnimation//无效
windowHideAnimation//无效

具体操作方法不赘述了:

1.网络上的经验:
Android 关于Activity的跳转和finish时切换页面动画实现(这篇写了两种,一种代码,一种xml)

2.说说我碰到的问题:
首先是xml方式,因为Activity继承自AppCompatActivity,在继承主题时会报

You need to use a Theme.AppCompat theme (or descendant) with this activity.
错误,需要取用合适的theme

这并不是重点,重点是程序运行起来之后根本没有动画效果,我在确认动画xml文件的参数后,依然没有效果(上面链接的博文中的倒数第二个xml文件的参数设置是有问题的)

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <translate android:fromXDelta="-100%" android:toXDelta="0"  
    android:duration="500" />  
    <alpha android:fromAlpha="0.1" android:toAlpha="1.0"  
        android:duration="500" />  
</set> 

//应该是

fromXDelta="100%"

回到重点,无奈之下,查看style.xml源代码,发现了Animation.Activity的一系列参数:

    <item name="activityOpenEnterAnimation">@anim/activity_open_enter</item>
    <item name="activityOpenExitAnimation">@anim/activity_open_exit</item>
    <item name="activityCloseEnterAnimation">@anim/activity_close_enter</item>
    <item name="activityCloseExitAnimation">@anim/activity_close_exit</item>
    <item name="taskOpenEnterAnimation">@anim/task_open_enter</item>
    <item name="taskOpenExitAnimation">@anim/task_open_exit</item>
    <item name="launchTaskBehindTargetAnimation">@anim/launch_task_behind_target</item>
    <item name="launchTaskBehindSourceAnimation">@anim/launch_task_behind_source</item>
    <item name="taskCloseEnterAnimation">@anim/task_close_enter</item>
    <item name="taskCloseExitAnimation">@anim/task_close_exit</item>
    <item name="taskToFrontEnterAnimation">@anim/task_open_enter</item>
    <item name="taskToFrontExitAnimation">@anim/task_open_exit</item>
    <item name="taskToBackEnterAnimation">@anim/task_close_enter</item>
    <item name="taskToBackExitAnimation">@anim/task_close_exit</item>
    <item name="wallpaperOpenEnterAnimation">@anim/wallpaper_open_enter</item>
    <item name="wallpaperOpenExitAnimation">@anim/wallpaper_open_exit</item>
    <item name="wallpaperCloseEnterAnimation">@anim/wallpaper_close_enter</item>
    <item name="wallpaperCloseExitAnimation">@anim/wallpaper_close_exit</item>
    <item name="wallpaperIntraOpenEnterAnimation">@anim/wallpaper_intra_open_enter</item>
    <item name="wallpaperIntraOpenExitAnimation">@anim/wallpaper_intra_open_exit</item>
    <item name="wallpaperIntraCloseEnterAnimation">@anim/wallpaper_intra_close_enter</item>
    <item name="wallpaperIntraCloseExitAnimation">@anim/wallpaper_intra_close_exit</item>
    <item name="fragmentOpenEnterAnimation">@animator/fragment_open_enter</item>
    <item name="fragmentOpenExitAnimation">@animator/fragment_open_exit</item>
    <item name="fragmentCloseEnterAnimation">@animator/fragment_close_enter</item>
    <item name="fragmentCloseExitAnimation">@animator/fragment_close_exit</item>
    <item name="fragmentFadeEnterAnimation">@animator/fragment_fade_enter</item>
    <item name="fragmentFadeExitAnimation">@animator/fragment_fade_exit</item>

逐一实验,发现其中只有两项参数对单一的activity有效果:
windowEnterAnimation和windowExitAnimation

        <item name="android:windowEnterAnimation">@anim/activity_in_left</item>
        <item name="android:windowExitAnimation">@anim/activity_out_right</item>

如果想得到没有titlebar的activity主题,需要这样写:

<style name="themeSetting">
        <item name="android:windowAnimationStyle">@style/AnimationActivity</item>
        <item name="android:windowNoTitle">true</item>
    </style>
    <style name="AnimationActivity" parent="@android:style/Animation.Activity">
        <item name="android:windowEnterAnimation">@anim/activity_in_left</item>
        <item name="android:windowExitAnimation">@anim/activity_out_right</item>
        </style>

另外,代码方式,我试过,也未见效果,最后才发现是调试的手机动画效果没开。。。。

其实在自己写动画的过程中利用Android自带的动画库可以实习部分位移效果,只是不满足activity连续画面的要求,下面贴出我写的位移AnimUtil类的部分代码:

/**
     * @return
     */
    private static TranslateAnimation moveFromTo(float fromX, float toX, float fromY, float toY) {
        TranslateAnimation mHiddenAction = new TranslateAnimation(Animation.RELATIVE_TO_SELF, fromX,
                Animation.RELATIVE_TO_SELF, toX, Animation.RELATIVE_TO_SELF,
                fromY, Animation.RELATIVE_TO_SELF, toY);
        mHiddenAction.setDuration(CData.AnimaDura);
        return mHiddenAction;
    }

    /**
     * @return
     */
    private static TranslateAnimation moveFromTo(float fromX, float toX, float fromY, float toY, long duration) {
        TranslateAnimation mHiddenAction = new TranslateAnimation(Animation.RELATIVE_TO_SELF, fromX,
                Animation.RELATIVE_TO_SELF, toX, Animation.RELATIVE_TO_SELF,
                fromY, Animation.RELATIVE_TO_SELF, toY);
        mHiddenAction.setDuration(duration);
        return mHiddenAction;
    }

    public static void hideFromLeftToRight(View view) {
        view.setAnimation(AnimatorU.moveFromTo(0, 1, 0, 0));
        view.setVisibility(View.INVISIBLE);
    }

    public static void showFromRightToLeft(View view) {
        view.setVisibility(View.VISIBLE);
        view.setAnimation(AnimatorU.moveFromTo(1, 0, 0, 0));
    }

    public static void hideFromRightToLeft(View view) {
        view.setAnimation(AnimatorU.moveFromTo(0, -1, 0, 0));
        view.setVisibility(View.INVISIBLE);
    }

    public static void showFromLeftToRight(View view) {
        view.setVisibility(View.VISIBLE);
        view.setAnimation(AnimatorU.moveFromTo(-1, 0, 0, 0));
    }

如果不是切换activity,而是让布局中的某个控件有位移效果的话,这个AnimatorU足够使用了。

关键是参数中的(fromX,toX,fromY,toY)结合type参数,相信稍微开动一下脑筋就能明白其中原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值