Activity转场动画设置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cui130/article/details/86544444

在这里插入图片描述


相关文章推荐
android共享元素动画兼容低版本

使用场景

从一个Activity A跳转到另外一个Activity B,B页面关闭回到A。这里动画涉及两个activity,有以下过程:
1.A打开B时A的离场动画和B的入场动画。
2.B关闭回到A时B的离场动画和A的入场动画。

原生自带

Android已经内置了几种动画效果,可以见 android.R.anim 类。一般情况下我们需要自己定义屏幕切换的效果。

自定义

主要有以下四个属性:
当我们从 A 启动 B 时,A 从屏幕上消失,这个动画叫做 android:activityOpenExitAnimation
当我们从 A 启动 B 时,B 出现在屏幕上,这个动画叫做 android:activityOpenEnterAnimation
当我们从 B 退出回到 A 时,B 从屏幕上消失,这个叫做 android:activityCloseExitAnimation
当我们从 B 退出回到 A 时,A 出现在屏幕上,这个叫做 android:activityCloseEnterAnimation

动画坐标定义

在这里插入图片描述
动画操作中操作的都是原点位置
fromYDelta="100%"为底部
fromYDelta="0%"为顶部
fromXDelta="0%"为左侧
fromXDelta="100%“为右侧
fromXDelta=”-100%“为左侧超出一个屏幕宽度
fromYDelta=”-100%"为顶部超出一个屏幕高度

动画差值器

动画差值器属性:
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
设置动画为先加速在减速(开始速度最快 逐渐减慢)
android动画差值器详解

方案选择

有两种方案可以实现
1.静态方式设置:将切换动画写到style中,再在theme中指定此style,在AndroidManifest中A和B的activity声明中设置此theme。
2.动态方式设置:在A的startActivity()方法后调用:

overridePendingTransition(R.anim.activity_b_translate_in_down_to_up,R.anim.activity_a_translate_out_down_to_up);

来设置B的进入动画和A的消失动画。
在B的finish()方法后调用:

overridePendingTransition(R.anim.activity_a_translate_in_up_to_down,R.anim.activity_b_translate_out_up_to_down);

来设置A的进场动画和B的消失动画。注意:要在super.finish()后设置。

撸代码

定义具体动画文件

这里的动画可以是透明度、位移、缩放之类的任何动画,我这里以位移来举例。

当我们 A 启动 B 时,我希望
A 从下至上平移退出屏幕(activity_a_translate_out_down_to_up),
B 从下至上平移进入屏幕(activity_b_translate_in_down_to_up)。

当我们从 B 退出回到 A 时,我希望
B 从上至下平移退出屏幕(activity_b_translate_out_up_to_down),
A 从上至下平移进入屏幕(activity_a_translate_in_up_to_down)。

1、activity_b_translate_in_down_to_up.xml

<?xml version="1.0" encoding="utf-8"?>

 <translate xmlns:android="http://schemas.android.com/apk/res/android"
      android:duration="300"
      android:fromYDelta="100%"//以左上角顶点作为原点移动,Y100%即为顶部,X100%即为右侧,0%为底部
      android:interpolator="@android:anim/accelerate_decelerate_interpolator"
      android:toYDelta="0%">
 </translate>

2、activity_b_translate_out_up_to_down.xml

<?xml version="1.0" encoding="utf-8"?>

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromYDelta="0%"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:toYDelta="100%">
</translate>

3、activity_a_translate_in_up_to_down.xml

<?xml version="1.0" encoding="utf-8"?>

 <translate xmlns:android="http://schemas.android.com/apk/res/android"
      android:duration="300"
      android:fromYDelta="-100%"
      android:interpolator="@android:anim/accelerate_decelerate_interpolator"
      android:toYDelta="0%">
 </translate>

4、activity_a_translate_out_down_to_up.xml

<?xml version="1.0" encoding="utf-8"?>

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromYDelta="0%"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:toYDelta="-100%">
</translate>

方案一

一、定义切换动画 style

res/values/styles.xml

 <style name="AnimFadeBottomToUp" parent="@android:style/Animation.Activity">

    <item name="android:activityOpenEnterAnimation">@anim/activity_b_translate_in_down_to_up</item>
    <item name="android:activityCloseExitAnimation">@anim/activity_b_translate_out_up_to_down</item>
    <item name="android:activityOpenExitAnimation">@anim/activity_a_translate_out_down_to_up</item>
    <item name="android:activityCloseEnterAnimation">@anim/activity_a_translate_in_up_to_down</item>
    
  </style>

二、定义包含动画的 Activity 主题
res/values/styles.xml
很简单,就是使用 windowAnimationStyle 这个属性,指定切换动画的style即可。

 <style name="vertical_slide" parent="android:Theme.NoTitleBar">
    <item name="android:windowAnimationStyle">@style/AnimFadeBottomToUp</item>
  </style>

三、注册该Activity到Manifest中,加上them属性就行了

 <activity
       android:name=".ActivityA"
       android:theme="@style/vertical_slide">
 </activity>
 <activity
       android:name=".ActivityB"
       android:theme="@style/vertical_slide">
 </activity>

四、调用启动Activity

	 A:
     Intent intent = new Intent(this, AnimationActivity.class);
     startActivity(intent);
     B:
     finish();

方案二

A:
Intent intent = new Intent(v.getContext(), AnimationActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.activity_b_translate_in_down_to_up,R.anim.activity_a_translate_out_down_to_up);

B:
@Override
public void finish() {
    super.finish();
	overridePendingTransition(R.anim.activity_a_translate_in_up_to_down,R.anim.activity_b_translate_out_up_to_down);
}

优缺点

方案一
优点:不需要考虑activity多个入口情况;
缺点:系统兼容性不好,5.0以下实效

方案二
优点:无兼容性问题;
缺点:多个入口的情况下每个入口都需要设置。

转场动画实效问题集录

1.在出现activity出现黑屏的时候 我们会这样设置
在这里插入图片描述
可以解决黑屏问题,同时引出另一个问题 :activity转场动画失效了

检查下清单文件内的动画资源是不是引用的不对 是不是写出了这样
在这里插入图片描述
如果是这样的话 改成这样就可以啦
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cui130/article/details/86544444