您的位置:首页 > 移动开发 > Android开发

【Android】Activity切换动画效果

2015-09-29 17:39 585 查看
结论:

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参数,相信稍微开动一下脑筋就能明白其中原理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android