通过代码来设置Activity的切换动画
当我们启动一个新的Activity的时候,需给当前Activity设置一个出去的动画,也要给进入的新的Activity一个进入的动画。当我们返回上一个Activity的时候,要给自己一个出去的动画,和上一个Activity的进入动画。如下:
定义Alpha动画
进入的动画 anim_alpha_in.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="400"
android:fromAlpha="0"
android:toAlpha="1.0"/>
</set>
表示从alpha=0 变成 alpha=1 持续时长400 毫秒
退出的动画 anim_alpha_out.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="400"
android:fromAlpha="1.0"
android:toAlpha="0"/>
</set>
我们定义了两个动画,同时还要使用动画。
启动新Activity应该在startActivity()的后面调用overridePendingTransition()如:
findViewById(R.id.btn_alpha).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AlphaActivity.class);
startActivity(intent);
//设置当前Activity退出的动画和新Activity进入的动画
overridePendingTransition(R.anim.anim_alpha_in, R.anim.anim_alpha_out);
}
});
从新的Activity回到旧的Activity时,应该在finish()后面调用overridePendingTransition()如:
新建AlphaActivity.java
public class AlphaActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alpha);
}
@Override
public void finish() {
super.finish();
//设置当前Activity退出的动画和新Activity进入的动画
overridePendingTransition(R.anim.anim_alpha_in, R.anim.anim_alpha_out);
}
}
我重写finish() 方法在super.finish() 后面执行动画,这样我们在当前Activity按返回键的时候就可以执行动画了。
效果如下:
可以看的两个Activity有切换有一个渐变效果,说明我们的动画设置成功。下面我们试试Translate动画。
定义Translate动画
与alpha动画不一样的是新Activity进入和退出走的动画是不一样的如下分析:
当启动新Activity时:旧Activity 从0移到-100% 而新Activity从 100% 到 0 如下:
anim_enter_translate_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromXDelta="0"
android:toXDelta="-100%"
/>
</set>
anim_enter_translate_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromXDelta="100%"
android:toXDelta="0"/>
</set>
当启动回到旧Activity时:旧Activity 从-100%移到0 而新Activity从 0 到 100% 如下:
anim_exit_translate_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromXDelta="-100%"
android:toXDelta="0"
/>
</set>
anim_exit_translate_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromXDelta="0"
android:toXDelta="100%"
/>
</set>
动画定义完了,使用和上面使用Alpha一样的如下:
启动:
findViewById(R.id.btn_translate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, TranslateActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.anim_enter_translate_in, R.anim.anim_enter_translate_out);
}
});
结束:
public class TranslateActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_translate);
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.anim_exit_translate_in, R.anim.anim_exit_translate_out);
}
}
效果:
下面将Tranlate动画和Alpha动画结合使用如下:
启动:
findViewById(R.id.btn_TranslateInAndAlphaOut).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, TranslateInAndAlphaOutActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.anim_enter_translate_in, R.anim.anim_enter_translate_out);
}
});
结束:
public class TranslateInAndAlphaOutActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_translate_in_and_alpha_out);
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.anim_alpha_in, R.anim.anim_alpha_out);
}
}
效果:
可以看的进入的时候是平移,而出去的时候是Alpha效果。
至于scale和rotate 这里就不演示了,基本一样。下面用style来指定Activity切换动画。
使用styles来设置Activity切换动画
像上面那样在代码里每次需要动画我们都要多写两个方法来实现效果,现在通过定义的主题来实现切换动画,这样只需要在用到的Activity里引用主题即可实现效果,非常方便。
我们这里就演示Tranlate动画如下:
1、定义动画,参考上面的四个动画文件
2、在values/styles.xml下定义动画
<!-- Base application theme. -->
<style name="AppAnimationTheme" parent="AppTheme">
<!--设置Activity切换动画-->
<item name="android:windowAnimationStyle">@style/ActivityAnimation</item>
</style>
<!--定义Activity切换动画 -->
<style name="ActivityAnimation">
<item name="android:activityOpenEnterAnimation">@anim/anim_enter_translate_in</item>
<item name="android:activityOpenExitAnimation">@anim/anim_enter_translate_out</item>
<item name="android:activityCloseEnterAnimation">@anim/anim_exit_translate_in</item>
<item name="android:activityCloseExitAnimation">@anim/anim_exit_translate_out</item>
</style>
3、这样我们只需要在使用动画的Activity里配置主题即可如下:
<activity
android:name=".MainActivity"
android:theme="@style/AppAnimationTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".AnimXmlActivity"
android:theme="@style/AppAnimationTheme">
</activity>
效果:
到此为止,Activity的切换动画已经介绍完了,我们可以定制自己动画来实现各种效果。