Activity添加进入和退出动画的两种方式,解决黑色区域问题

简介: Activity添加进入和退出动画的两种方式,解决黑色区域问题

Activity添加进入和退出动画的两种方式,解决黑色区域问题

给Activity添加进入和退出动画的操作,大家一定不会陌生。常见的有两种方式,一种是通过style文件给Activity设置Theme,另一种是直接代码中调用Activity#overridePendingTransition)方法。

使用代码和使用style文件是一样的效果,下面举例进行说明,比如说我们的Activity进入动画需要从下往上滑动,退出需要从上往下滑动。

通过style文件给Activity设置Theme来实现

styles.xml中:

<style name="AnimationActivityTopDown" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_down</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_down</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_up</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_up</item>
</style>

对应的anim文件:

res/anim/slide_in_down.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300">
    <translate
        android:fromYDelta="100%"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toYDelta="0"/>
</set>

res/anim/slide_out_down.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300">
    <translate
        android:fromYDelta="0"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toYDelta="-100%" />
</set>

res/anim/slide_in_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300">
    <translate
        android:fromYDelta="-100%"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toYDelta="0" />
</set>

res/anim/slide_out_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300">
    <translate
        android:fromYDelta="0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toYDelta="100%" />
</set>

接着将动画的style设置给目标Activity的style,然后将目标Activity的style设置给Activity的theme属性:

<style name="TopDownAnim" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowAnimationStyle">@style/AnimationActivityTopDown</item>
</style>
<activity
    android:name=".ActivityAnimActivity"
    android:label="Activity动画"
    android:theme="@style/TopDownAnim"></activity>

具体效果图如下:

通过Activity#overridePendingTransition)方法

基于上面的anim文件,我们在启动目标Activity时,在startActivity后立即调用Activity#overridePendingTransition)方法,代码如下:

btn_activity_anim.setOnClickListener {
    startActivity(Intent(this, ActivityAnimActivity::class.java))
    // 进入,从下往上动画
    overridePendingTransition(R.anim.slide_in_down, R.anim.slide_out_down)
}

在目标Activity关闭时,也调用Activity#overridePendingTransition)方法,代码如下:

override fun finish() {
    super.finish()
    // 退出,从上往下动画
    overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up)
}

具体效果如下:

细节优化——动画中的黑边去除

上面粗略的实现了动画效果,细心点的同学可以看到,在页面切换的过程中,可以明显的看见Activity的顶部有块黑色区域,如何去除呢?

这个还得从Activity的theme入手,具体如下:

<style name="TopDownAnim" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <!-- 去除Activity顶部黑线 -->
    <item name="android:windowContentOverlay">@null</item>
    <!-- 系统状态栏背景设置透明 -->
    <item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="lollipop">
        @android:color/transparent
    </item>
    <!-- Activity背景 -->
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowAnimationStyle">@style/AnimationActivityTopDown</item>
</style>

项目地址

AndroidStudy

具体请看ActivityAnimActivity

参考:

Activity从屏幕底部滑出、滑入、处理黑色背景和状态栏

相关文章
|
XML Java Android开发
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
1173 0
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
1038 12
|
缓存 Android开发 iOS开发
Kotlin跨平台Compose Multiplatform实战指南
Kotlin Multiplatform (KMP) 结合 Compose Multiplatform,助力开发者用一套代码构建跨平台应用(Android、iOS、桌面和 Web)。本文提供实战指南,涵盖环境搭建、项目结构、共享 UI 编写、平台适配、状态管理及资源处理等内容。通过 expect/actual 处理差异,借助官方文档与示例项目学习,减少重复代码,优化多平台开发体验。
2915 18
|
XML 缓存 IDE
解决Android Studio报错:Compilation is not supported for following modules
本文主要解决和"Compilation is not supported for following modules"有关的报错。
2601 0
解决Android Studio报错:Compilation is not supported for following modules
|
人工智能 安全 API
claude中文版怎么使用?轻松解锁国内使用Claude 技能
渴望体验 Anthropic 公司开发的强大 AI 模型 Claude 的魅力,却被网络限制所阻挡?不必担心!🚀 这篇指南将为你详细剖析 Claude 的强大功能,并提供多种方法,让你即使身处国内,也能轻松驾驭 Claude 的力量,开启 AI 新世界的大门
|
Android开发
Android | Fragment.setUserVisibleHint()懒加载过时问题优化
Fragment.setUserVisibleHint()懒加载过时问题优化
1044 0
|
Android开发 开发者 Kotlin
Android 多进程情况下判断应用是否处于前台或者后台
本文介绍在多进程环境下判断Android应用前后台状态的方法。通过`ActivityManager`和服务信息`RunningAppProcessInfo`可有效检测应用状态,优化资源使用。提供Kotlin代码示例,帮助开发者轻松集成。
1526 8
|
API Android开发
31. 【Android教程】状态栏通知:Notification
31. 【Android教程】状态栏通知:Notification
1990 1
|
Android开发 UED
Android采用Scroller实现底部二楼效果
Android采用Scroller实现底部二楼效果
299 0
Android采用Scroller实现底部二楼效果
|
XML Android开发 UED