Android 特定页面实现进入退出动画
本文讲解了如何在 Android 的特定页面中实现特定的页面进入和退出转场动画。
在 Android 中,要进入退出页面的动画,可以有两种方式:转场动画和共享元素动画。而转场的实现方式有多种,分为全局的转场动画和特定页面的转场动画。全局生效的转场动画
特定页面的转场动画
当从 A 页面进入 B 页面,如果需要在 B 页面设置从下往上弹出的转场动画,则可以使用以下方式设置:
- 从下往上的进入动画,可以在 Activity 的 onCreate 方法中设置;从上往下的退出动画,可以在 Activity 的 onBackPressed 和 finish 方法中设置:
class BActivity : BaseActivity {
override fun onCreate(savedInstanceState: Bundle?) {
overrideInOutAnim()
super.onCreate(savedInstanceState)
}
override fun onBackPressed() {
super.onBackPressed()
overrideInOutAnim()
}
override fun finish() {
super.finish()
overrideInOutAnim()
}
// 设置进入退出动画
private fun overrideInOutAnim() {
overridePendingTransition(R.anim.bottom_in, R.anim.bottom_out)
}
}
- 转场动画的定义如下,
@android:integer/config_mediumAnimTime
的值为 400 毫秒:
<?xml version="1.0" encoding="utf-8"?>
<!-- 文件名 bottom_in -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<!-- 文件名 bottom_out -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="0"
android:toYDelta="100%p" />
</set>
- 显示转场动画时,B 页面可能会遇到黑屏。此时我们可以将 BActivity 的背景色设置为透明,将 BActivity 里的布局的背景设置成 Activity 的背景。
<!-- 文件名:AndroidManifest.xml -->
<activity
android:name="com.myandroid.test.BActivity"
android:screenOrientation="portrait"
android:theme="@style/transparentWithStatusBar"
/>
在主题中使用 <item name="android:windowBackground">@android:color/transparent</item>
可以设置 Activity 背景为透明;android:windowFullscreen
可以设置状态栏是否展示,true 为不展示,false 为展示:
<!-- 文件名:styles.xml -->
<style name="transparentWithStatusBar" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowFullscreen">false</item>
<item name="windowNoTitle">true</item>
</style>
而 BActivity 的背景可以设置在 View 中:
<!-- 文件名:activity_b.xml -->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:orientation="vertical"
android:gravity="start"
android:background="@color/activity_background"
tools:context=".BActivity">
</LinearLayout>
</layout>