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从屏幕底部滑出、滑入、处理黑色背景和状态栏

相关文章
|
Windows
关于 Qt设置置顶窗口,透明部分显示黑色底色(已设置透明窗口) 的解决方法
关于 Qt设置置顶窗口,透明部分显示黑色底色(已设置透明窗口) 的解决方法
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
|
前端开发 JavaScript 容器
JavaScrpit如何实现弹出遮罩层后将页面固定到当前位置且无法继续滚动
JavaScrpit如何实现弹出遮罩层后将页面固定到当前位置且无法继续滚动
89 0
|
9月前
|
定位技术 iOS开发
在地图页面,自动布局控件开始是隐藏或在屏幕外需要正常显示时再为正常的显示状态的,需要在显示之前加入
在地图页面,自动布局控件开始是隐藏或在屏幕外需要正常显示时再为正常的显示状态的,需要在显示之前加入
62 0
|
编解码 前端开发
前端设置页面字体尺寸跟随屏幕大小而进行变化
前端设置页面字体尺寸跟随屏幕大小而进行变化
711 0
前端设置页面字体尺寸跟随屏幕大小而进行变化
|
存储 图形学
|
JavaScript 开发者
动画-小球动画 flag 标识符的作用分析|学习笔记
快速学习动画-小球动画 flag 标识符的作用分析
174 0
动画-小球动画 flag 标识符的作用分析|学习笔记
|
JavaScript 开发者
动画-小球动画flag标识符的作用分析|学习笔记
快速学习动画-小球动画flag标识符的作用分析
124 0
动画-小球动画flag标识符的作用分析|学习笔记
SwiftUI—如何以动画的方式显示或隐藏指定的位图
SwiftUI—如何以动画的方式显示或隐藏指定的位图
344 0
|
Dart 开发者
【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )(三)
【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )(三)
245 0
【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )(三)