安卓统一添加activity切换动画
2016-11-08 18:42
239 查看
版权声明:本人所有文章均采用 [知识共享 署名-非商业性使用-禁止演绎 4.0 国际 许可协议] 转载前请保证理解此协议,原文出处 :http://www.gcssloop.com/#blog
![](http://img.blog.csdn.net/20151014211203884)
create_zoomin.xml
create_zoomout.xml
(页面结束返回到上一页用到的两个动画文件)
finish_zoomin.xml
finish_zoomout.xml
基本就是这样了,看我罗嗦了半天,其实原理很简单,感兴趣的小伙伴可以直接去看源码:
2.在AppTheme中引用动画
3.在AndroidManifest.xml中给Activity使用该主题,如下:
4.注意:style的某些属性可能使配置的动画失效无法执行,如:
另外Activity的启动模式设置也可能导致配置的动画无法运行:
不同的ROM也可能会引起设置失效,为了保证所有平台的完美运行,可能需要获取设置的属性,在程序的oncreate方法和finish方法中进行手动调用。
该方法比较靠谱,但是如果安卓系统中定制了默认界面切换动画,两个动画会叠加执行。
安卓统一添加activity切换动画
作者微博:攻城师sloop
背景说明
在实际 的应用开发过程中各种动画的使用不仅能使用户感觉起来更加流畅而且合适的动画效果可以帮助用户快速的熟悉应用操作,对提升用户体验来说,动画是必不可少的。
在安卓2.0之后,安卓提供了一个很方便的API用来设置安卓界面切换动画:overridePendingTransition(EnterAnim, ExitAnim);
发现问题
但是这里有一个缺点,就是每次打开activity之前都要重写这个动画效果,如果activity比较多岂不是要重复的写很多遍?对于追(lan)求(ai)简(wan)洁(qi)优(huan)美(zhe)的程序员怎么可以忍受。
既然出现问题就要解决,如何才能简洁优雅的为activity添加动画效果呢?
分析解决
作为一个有(fei)追(chang)求(lan)的程序员,自然想在界面切换的时候就能自动添加动画效果。
一般来说,如果想让某一类组件均具有相同的效果我们首先想到的就是重写这个组件的基类,然后让组件继承这个基类。这个是与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>
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>
(页面结束返回到上一页用到的两个动画文件)
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>
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>
2.自定义Activity基类
BaseActivity.javapublic 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); } }
3.让所有Activity继承自BaseActivity
例如:public class MainActivity extends BaseActivity { }
4.在需要打开新页面时只使用openActivity函数
例如:openActivity(SeccondActivity.class);
基本就是这样了,看我罗嗦了半天,其实原理很简单,感兴趣的小伙伴可以直接去看源码:
【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>
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>
3.在AndroidManifest.xml中给Activity使用该主题,如下:
<activity android:name=".SeccondActivity" android:label="@string/title_activity_seccond" android:theme="@style/AppTheme.NoActionBar" > </activity>
4.注意:style的某些属性可能使配置的动画失效无法执行,如:
<item name="android:windowIsTranslucent">true</item>
另外Activity的启动模式设置也可能导致配置的动画无法运行:
android:launchMode="singleInstance"
不同的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>
该方法比较靠谱,但是如果安卓系统中定制了默认界面切换动画,两个动画会叠加执行。
以上为个人在华为系统上测试的结果,可能会与其他系统效果存在差异,各位小伙伴如果想要研究可以自己测试 一下。
欢迎转载分享,转载请标明作者:攻城师sloop
另外,如果你觉得不错,顺手点个赞呗。
相关文章推荐
- 安卓统一添加activity切换动画
- android统一添加activity切换动画
- android统一添加activity切换动画
- Android Activity界面切换添加动画特效
- Android Activity界面切换添加动画特效(转)
- Android设置activity统一切换动画
- 安卓组件---Activity---activity切换动画
- 安卓手机卫士学习笔记系列——两个Activity之间切换动画效果overridependingtransition的使用
- Activity实现欢迎界面并添加动画切换效果
- 安卓切换Activity时的动画效果
- 安卓页面切换添加动画效果
- Android Activity界面切换添加动画特效(转)
- 给Activity切换过程添加动画效果
- Android实现Activity界面切换添加动画特效的方法
- Android Activity界面切换添加动画特效 (转载修改)
- activity 之间切换添加动画效果(一)
- activity切换添加动画
- Android Activity界面切换添加动画特效
- Android Activity界面切换添加动画特效(转)
- 为安卓APP设置统一风格的界面切换动画