欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

安卓统一添加activity切换动画

程序员文章站 2022-05-05 14:21:24
...

安卓统一添加activity切换动画


作者微博:攻城师sloop

背景说明

在实际 的应用开发过程中各种动画的使用不仅能使用户感觉起来更加流畅而且合适的动画效果可以帮助用户快速的熟悉应用操作,对提升用户体验来说,动画是必不可少的。

在安卓2.0之后,安卓提供了一个很方便的API用来设置安卓界面切换动画:overridePendingTransition(EnterAnim, ExitAnim);

发现问题

但是这里有一个缺点,就是每次打开activity之前都要重写这个动画效果,如果activity比较多岂不是要重复的写很多遍?对于追(lan)求(ai)简(wan)洁(qi)优(huan)美(zhe)的程序员怎么可以忍受。

既然出现问题就要解决,如何才能简洁优雅的为activity添加动画效果呢?

分析解决

作为一个有(fei)追(chang)求(lan)的程序员,自然想在界面切换的时候就能自动添加动画效果。

一般来说,如果想让某一类组件均具有相同的效果我们首先想到的就是重写这个组件的基类,然后让组件继承这个基类。这个是与Activity相关的内容,我们就自己实现一个Activity的基类,重写里面相关部分的函数。

结果演示

为了方便大家理解我们就做一个小例子。

先看一下效果(质量不太好 见谅):

安卓统一添加activity切换动画

1.准备动画文件

(开启新界面用到的两个动画文件)
create_zoomin.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.android.com/apk/res/android"
        Android:interpolator="@android:anim/decelerate_interpolator">
        <scale
        Android:duration="@android:integer/config_mediumAnimTime
        Android:fromXScale=".8"
        Android:fromYScale=".8"
        Android:pivotX="50%p"
        Android:pivotY="50%p"
        Android:toXScale="1.0"
        Android:toYScale="1.0" />
    </set>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

create_zoomout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.android.com/apk/res/android"
        Android:interpolator="@android:anim/decelerate_interpolator"
        Android:zAdjustment="top">
        <scale
            Android:duration="@android:integer/config_mediumAnimTime"
            Android:fromXScale="1.0"
            Android:fromYScale="1.0"
            Android:pivotX="50%p"
            Android:pivotY="50%p"
            Android:toXScale="2"
            Android:toYScale="2" />
        <alpha
            Android:duration="@android:integer/config_mediumAnimTime"
            Android:fromAlpha="0.5"
            Android:toAlpha="0" />
    </set> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

(页面结束返回到上一页用到的两个动画文件)

finish_zoomin.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.android.com/apk/res/android"
        Android:interpolator="@android:anim/decelerate_interpolator">
        <scale
            Android:duration="@android:integer/config_mediumAnimTime"
            Android:fromXScale="2.0"
            Android:fromYScale="2.0"
            Android:pivotX="50%p"
            Android:pivotY="50%p"
            Android:toXScale="1.0"
            Android:toYScale="1.0" />
    </set>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

finish_zoomout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.android.com/apk/res/android"
        Android:interpolator="@android:anim/decelerate_interpolator"
        Android:zAdjustment="top">
        <scale
            Android:duration="@android:integer/config_mediumAnimTime"
            Android:fromXScale="1.0"
            Android:fromYScale="1.0"
            Android:pivotX="50%p"
            Android:pivotY="50%p"
            Android:toXScale=".5"
            Android:toYScale=".5" />
        <alpha

            Android:duration="@android:integer/config_mediumAnimTime"
            Android:fromAlpha="1.0"
            Android:toAlpha="0" />
    </set> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.自定义Activity基类

BaseActivity.java

    public class BaseActivity extends AppCompatActivity {

        /**
         * 打开activity
         */
        protected void openActivity(Class<?> cls) {
            openActivity(this, cls);
            overridePendingTransition(R.anim.create_zoomin, R.anim.create_zoomout);
        }

        /**
         * 打开activity
         */
        public static void openActivity(Context context, Class<?> cls) {
            Intent intent = new Intent(context, cls);
            context.startActivity(intent);
        }

        @Override
        public void finish() {
            super.finish();
            overridePendingTransition(R.anim.finish_zoomin, R.anim.finish_zoomout);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

3.让所有Activity继承自BaseActivity

例如:

public class MainActivity extends BaseActivity {
}
  • 1
  • 2

4.在需要打开新页面时只使用openActivity函数

例如:

openActivity(SeccondActivity.class);
  • 1

基本就是这样了,看我罗嗦了半天,其实原理很简单,感兴趣的小伙伴可以直接去看源码: 【ActivityAnimTest】


其他方法

之前查资料的时候只查到了上面这一种方法,就偷懒没有再去查询其他方法,由于热心的小伙伴提出了疑问,所以我查找了用style文件配置切换动画的方法。

通过配置Activity动画来实现

1.在res/values/styles.xml文件配置动画,如下:

  <!-- 默认Activity跳转动画 -->
    <style name="default_animation" mce_bogus="1" parent="@android:style/Animation.Activity">
        <item name="android:activityOpenEnterAnimation">@anim/create_zoomin</item>
        <item name="android:activityOpenExitAnimation">@anim/create_zoomout</item>
        <item name="android:activityCloseEnterAnimation">@anim/finish_zoomin</item>
        <item name="android:activityCloseExitAnimation">@anim/finish_zoomout</item>
    </style>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.在AppTheme中引用动画

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowAnimationStyle">@style/default_animation</item>
    </style>
  • 1
  • 2
  • 3
  • 4
  • 5

3.在AndroidManifest.xml中给Activity使用该主题,如下:

  <activity
            android:name=".SeccondActivity"
            android:label="@string/title_activity_seccond"
            android:theme="@style/AppTheme.NoActionBar" >
        </activity>
  • 1
  • 2
  • 3
  • 4
  • 5

4.注意:style的某些属性可能使配置的动画失效无法执行,如:

<item name="android:windowIsTranslucent">true</item>
  • 1

另外Activity的启动模式设置也可能导致配置的动画无法运行:

    android:launchMode="singleInstance"
  • 1
  • 2

不同的ROM也可能会引起设置失效,为了保证所有平台的完美运行,可能需要获取设置的属性,在程序的oncreate方法和finish方法中进行手动调用。

通过配置Window动画实现

步骤和上面类似,只是把第1步改为:

   <!-- 默认Activity跳转动画 -->
    <style name="default_animation" mce_bogus="1" parent="@android:style/Animation.Activity">
        <item name="android:windowEnterAnimation">@anim/create_zoomin</item>
        <item name="android:windowExitAnimation">@anim/create_zoomout</item>
    </style>
  • 1
  • 2
  • 3
  • 4
  • 5

该方法比较靠谱,但是如果安卓系统中定制了默认界面切换动画,两个动画会叠加执行。

以上为个人在华为系统上测试的结果,可能会与其他系统效果存在差异,各位小伙伴如果想要研究可以自己测试 一下。

欢迎转载分享,转载请标明作者:攻城师sloop

另外,如果你觉得不错,顺手点个赞呗。