安卓三种动画之一View Animation与 案例 为活动的载入与退出添加动画
View Animation(视图动画)
View动画的概述及种类
视图动画的作用对象是View,支持四种动画效果,分别是平移动画,缩放动画,旋转动画,透明度动画。譬如,我们可以对TextView设置其文本的移动,旋转,缩放,透明。
视图动画可以通过XML或通过代码动态创建,对于视图动画建议使用XML文件定义,因为它具有更高的可读性,可重用性。
名称 | 标签 | 子类 | 效果 |
---|---|---|---|
平移动画 | < translate > | TranslateAnimation | 移动View |
缩放动画 | < scale > | ScaleAnimation | 放大或缩小View |
旋转动画 | < rotate > | RotateAnimation | 旋转view |
透明度动画 | < alpha > | Alpha | 改变View的透明度 |
要使用View动画,首先要创建XML文件,我们需要在res下新建anim文件夹,接着在anim下创建animation resource file的xml文件,我们举例为view_anim.xml
我们通过xml文件来了解它们各自的语法:
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android">
<!--平移动画标签-->
<translate
android:fromXDelta="0%p"
android:toXDelta="20%p"
android:fromYDelta="0%p"
android:toYDelta="20%p"
android:duration="4000"/>
<!--缩放动画标签-->
<scale
android:fromXScale="1.0"
android:toXScale="0.2"
android:fromYScale="1.0"
android:toYScale="0.2"
android:pivotX="50%"
android:pivotY="50%"
android:duration="4000"/>
<!--旋转动画标签-->
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="4000"/>
<!--透明度动画标签-->
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.2"
android:duration="4000"/>
</set>
从上面的代码我们知道,View动画既可以是单个动画,也可以有一系列动画组成。
这是因为View动画的四种种类分别对应着Animation的四个子类(TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation),除了以上四个子类它还有一个AnimationSet类,对应xml标签为,它是一个容器,可以包含若干个动画,并且内部也可以继续嵌套集合的。
在活动中加载这个动画
由工具类AnimationUtils中的方法,获得一个Animation 对象。
loadAnimation()需要两个形参,一个是要加载到的context, 一个是动画的来源文件。
Animation animation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.viewanimation);
textView.startAnimation(animation);
注意:无论是在什么地方,需要加载一个动画都是要加载或者引用一个xml文件
View动画的属性详解
Animation属性详解:
xml属性 | java方法 | 解释 |
---|---|---|
android:duration | setDuration(long) | 动画持续时间,毫秒为单位 |
android:ShareInterpolator | setInterpolator(Interpolator) | 设定插值器(指定的动画效果,譬如回弹等) |
android:fillAfter | setFillAfter(boolean) | 控件动画结束时是否保持动画最后的状态 |
android:fillBefore | setFillBefore(boolean) | 控件动画结束时是否还原到开始动画前的状态 |
android:repeatMode | setRepeatMode(int) | 重复类型有两个值,reverse表示倒序回放,restart表示从头播放 |
android:startOffset | setStartOffset(long) | 调用start函数之后等待开始运行的时间,单位为毫秒 |
TranslateAnimation属性详解:
xml属性 | java方法 | 解释 |
---|---|---|
android:fromXDelta | TranslateAnimation(float fromXDelta, …) | 起始点X轴坐标,数值,百分比,百分比p,注[^1] |
android:fromYDelta | TranslateAnimation(…, float fromYDelta, …) | 起始点Y轴从标,同上规律 |
android:toXDelta | TranslateAnimation(float fromXDelta, …) | 结束点X轴坐标,同上规律 |
android:toYDelta | TranslateAnimation(…, float toYDelta) | 结束点Y轴坐标,同上规律 |
注①: 数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点。
RotateAnimation属性,ScaleAnimation属性详解:
与TranslateAnimation基本相似,只是多了一个android:pivotX性质,该性质表示缩放起点X坐标(相当于缩放的中点X坐标)
AnimationSet属性详解:
AnimationSet继承自Animation,是上面四种的组合容器管理类,没有自己特有的属性,他的属性继承自Animation,所以特别注意,当我们对set标签使用Animation的属性时会对该标签下的所有子控件都产生影响。譬如我们在set标签下加入duration=“1000”,子控件的duration属性会失效。
为活动的载入与退出添加全局动画
要想给全部的活动添加动画,要在style文件中的<style name=“AppTheme” 添加一个子标签
<item name=“android:windowAnimationStyle” …
该标签传入的是传入的是继承@android:style/Animation.Activity的style标签。@android:style/Animation.Activity是表示安卓系统下Style库中的动画类,对应的是系统性的操作。
<item name="android:windowAnimationStyle">@style/AnimationActivity</item>
在同一文件下,新建一个style标签,并且在其对于活动退出和进入的子标签中,传入相应的动画xml文件
关闭活动对应于onBackPressed(), 打开活动对应于Intent()
<style name="AnimationActivity" parent="@android:style/Animation.Activity">
<!-- 打开activity时,新进入的activity执行的动画, 传入的值是一个资源文件-->
<item name="android:activityOpenEnterAnimation">@anim/open_enter</item>
<!-- 打开activity时,退出的activity执行的动画, 传入的值是一个资源文件-->
<item name="android:activityOpenExitAnimation">@anim/open_exit</item>
<!-- 关闭activity时,进入的activity执行的动画, 传入的值是一个资源文件-->
<item name="android:activityCloseEnterAnimation">@anim/close_enter</item>
<!-- 关闭activity时,退出的activity执行的动画, 传入的值是一个资源文件-->
<item name="android:activityCloseExitAnimation">@anim/close_exit</item>
</style>
在res下新建anim文件夹,接着在anim下创建4个animation resource file的xml文件。
活动跳转时的动画错乱问题
<item name=“android:windowAnimationStyle” 这一属性的动画过渡效果是通过task栈的插入和弹出来进行的。
当跳转活动时,intent添加了一些标识符,干扰了正常的task栈的插入和弹出,就会出现动画错乱的问题。
解决方法:通过Activity类的public void overridePendingTransition(int enterAnim, int exitAnim)手动指定活动的进出动画。注意,该方法只能在startActivity(intent)之后调用。
public static void logout(Context context){
Intent intent = new Intent(context, LoginActivity.class);
// 添加intent标识符,清理activity返回栈,并且新生成task栈
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
((Activity)context).overridePendingTransition(R.anim.open_enter,R.anim.open_exit);
}