需求
系统默认activity跳转动画交互满足不了项目需求,需要自定义动画实现交互效果。
实现方法
Step1 - 自定义动画效果
在res/anim文件下自定义动画效果文件
-
open_enter
实现效果: 缩放从屏幕中间一点到全屏,透明度从0到1
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:duration="@android:integer/config_mediumAnimTime"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0"/>
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
</set>
- **open_exit**
实现效果: 缩放从整个屏幕 - 屏幕中间一点,透明度从1到0
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<scale
android:duration="@android:integer/config_mediumAnimTime"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.0"
android:toYScale="0.0"/>
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="1.0"
android:toAlpha="0.0"/>
</set>
-
close_enter
实现效果: 缩放从1.5倍屏幕 - 整屏幕,透明度从0.5到1
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:duration="@android:integer/config_mediumAnimTime"
android:fromXScale="1.5"
android:fromYScale="1.5"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:toXScale="1.0"
android:toYScale="1.0"/>
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="0.5"
android:toAlpha="1.0"/>
</set>
-
close_exit
实现效果: 缩放从整屏幕到0.5屏幕,透明度从1到0
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:duration="@android:integer/config_mediumAnimTime"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:toXScale="0.5"
android:toYScale="0.5"/>
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="1.0"
android:toAlpha="0.0"/>
</set>
可以根据自己的需求修改动画效果
例如实现 进入页面屏幕左滑,突出页面屏幕右滑
见 附录1
Step2 - 自定义样式
在res/values/styles.xml中自定义样式
<style name="Animation_Activity"
parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/open_enter</item>
<item name="android:activityOpenExitAnimation">@anim/open_exit</item>
<item name="android:activityCloseEnterAnimation">@anim/close_enter</item>
<item name="android:activityCloseExitAnimation">@anim/close_exit</item>
</style>
<style name="AppTheme_" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowAnimationStyle">@style/Animation_Activity
</item>
</style>
-
说明:
android:activityOpenEnterAnimation //新的activity创建进入效果
android:activityOpenExitAnimation //activity还没有finish()下退出效果
android:activityCloseEnterAnimation //上一个activity返回进入效果
android:activityCloseExitAnimation //上一个activity finish()之后退出效果
这四个属性按照顺序记忆口诀是“新进、旧出;旧进、新出”,android studio格式排版的默认顺序就是这个顺序来的。
-
使app中所有界面跳转实现自定义
在清单文件mainifests.xml中修改application的theme属性为自定义的样式
使FirstActivity跳转到SecondActivity实现自定义
在FirstActivity的startActivity()之后使用overridePendingTransition()方法
//FirstActivity中
startActivity(new Intent(this, SecondActivity.class));
overridePendingTransition(R.anim.open_enter,R.anim.open_exit);
在SecondActivity的finish()方法后使用overridePendingTransition()方法
//SecondActivity
finish();
overridePendingTransition(R.anim.close_enter, R.anim.close_exit);
注意事项
关于overridePendingTransition()这个函数
- 挨着startActivity()或者finish()函数之后调用
- 适用 android2.0以及以上版本上
overridePendingTransition 这个函数会不起作用的原因:
- 在ActivityGroup等的嵌入式Activity中,使用
this.getParent().overridePendingTransition()
。 - 在一个Activity的内部类中,或者匿名类中,使用handler。
- 手机的显示动画效果被关闭, 设置->显示->显示动画效果重新打开即可。
附录1
open_enter
实现效果: 向左滑进入屏幕
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<!--左滑:进入屏幕-->
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="100%p"
android:toXDelta="0%p"/>
</set>
-
open_exit
实现效果: 向左滑动推出屏幕
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<!--左滑:退出屏幕-->
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="0%p"
android:toXDelta="-100%p"/>
</set>
-
close_enter
实现效果: 向右滑动进入屏幕
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<!--右滑:进入屏幕-->
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="-100%p"
android:toXDelta="0%p"/>
</set>
-
close_exit
实现效果: 向右滑动退出屏幕
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<!--右滑:退出屏幕-->
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="-0%p"
android:toXDelta="100%p"/>
</set>