android之animation解析一

来源:互联网 发布:minimax算法 编辑:程序博客网 时间:2024/05/06 10:46

我们开发一款app,为了用户体验效果更好,必然少不了动画的效果,动画之前我用flash做过一些简单的小demo,后来android开发中,我们可以不用flash也可以做出那样的效果,而且自己比较喜欢这些小动画的,就私下来自己研究了,来分享给大家。


Activity的切换动画

从安卓2.0开始在Activity增加了一个方法:
public void overridePendingTransition (int enterAnim, int exitAnim)
其中第一个参数为进入时的动画,第二参数为退出时的动画。
该方法需要在startActivity或者finish方法之后调用。


修改Activity的动画样式:

<style name="Theme.Test" parent="@android:style/Theme.Light.NoTitleBar">      <item name="android:windowAnimationStyle">@style/Animation.Activity.Test</item>  </style>  <style name="Animation.Activity.Test" parent="@android:style/Animation.Activity">    <item name="android:activityOpenEnterAnimation">@anim/activity_open_enter</item>    <item name="android:activityOpenExitAnimation">@anim/activity_open_exit</item>    <item name="android:activityCloseEnterAnimation">@anim/activity_close_enter</item>    <item name="android:activityCloseExitAnimation">@anim/activity_close_exit</item>    <item name="android:taskOpenEnterAnimation">@anim/activity_open_enter</item>    <item name="android:taskOpenExitAnimation">@anim/activity_open_exit</item>    <item name="android:taskCloseEnterAnimation">@anim/activity_close_enter</item>    <item name="android:taskCloseExitAnimation">@anim/activity_close_exit</item>    <item name="android:taskToFrontEnterAnimation">@anim/activity_open_enter</item>    <item name="android:taskToFrontExitAnimation">@anim/activity_open_exit</item>    <item name="android:taskToBackEnterAnimation">@anim/activity_close_enter</item>    <item name="android:taskToBackExitAnimation">@anim/activity_close_exit</item></style> 

在清单文件中给Activity设置该样式即可。
如果我们把以上的动画全定义成@null,那么Activity切换就不会出现动画了,连系统自带的动画也不会出现。
如果在Activity的样式文件中加入了下面的代码,则Activity就会出现Dailog的样式了:
true


补间动画

Android的animation由四种类型组成
详见文档 android-sdk-windows/docs/guide/topics/resources/animation-resource.html
Animation主要有两种动画模式:
一种是tweened animation(渐变动画)
alpha–>AlphaAnimation
scale–>ScaleAnimation

一种是frame by frame(画面转换动画)
translate–>TranslateAnimation
rotate–>RotateAnimation


在XML文件中定义动画
在res目录下建立anim文件夹,创建xml文件:

<?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android"    /> 

以上为创建一个透明度渐变的动画。
当有多个动画需要组合到一起时,使用set元素包裹:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">   <alpha/>   <scale/>   <translate/>   <rotate/></set> 

以上为创建一个组合动画。


Android动画解析–XML
1、透明渐变动画:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >    <alpha        android:fromAlpha="0.1"        android:toAlpha="1.0"        android:duration="3000"    /> </set> 

fromAlpha 属性为动画起始时透明度
toAlpha 属性为动画结束时透明度,透明度取值为0.0-1.0之间的float型数字,0.0为全透明,1.0为完全不透明
duration 属性为动画持续时间,单位为毫秒


2、比例变化动画:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <scale  android:interpolator="@android:anim/accelerate_decelerate_interpolator"           android:fromXScale="0.0"           android:toXScale="1.4"           android:fromYScale="0.0"           android:toYScale="1.4"           android:pivotX="50%"           android:pivotY="50%"           android:fillAfter="false"           android:duration="700" /></set> 

interpolator 指定一个动画的插入器
fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
toXScale 属性为动画结束时 X坐标上的伸缩尺寸
fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
toYScale 属性为动画结束时Y坐标上的伸缩尺寸
以上四种属性取值为float型数字,0.0表示收缩到没有,1.0表示正常无伸缩,值小于1.0表示收缩,值大于1.0表示放大
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
以上两种属性从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
duration 属性为动画持续时间,单位为毫秒
fillAfter 属性当设置为true,动画结束后保留结束时的状态,当设置为false,动画结束后回到动画最初时候的状态。


3、位移动画:

<translate><?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:fromXDelta="30"        android:toXDelta="-80"        android:fromYDelta="30"        android:toYDelta="300"        android:duration="2000"    /></set> 

fromXDelta 属性为动画起始时 X坐标上的位置
toXDelta 属性为动画结束时 X坐标上的位置
fromYDelta 属性为动画起始时 Y坐标上的位置
toYDelta 属性为动画结束时 Y坐标上的位置
以上四种属性可以加%和p,例如:
android:toXDelta=”100%”,表示自身的100%,也就是从View自己的位置开始。
android:toXDelta=”80%p”,表示父层View的80%,是以它父层View为参照的。
duration 属性为动画持续时间,单位为毫秒


4、旋转动画:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >    <rotate        android:duration="3000"        android:fromDegrees="0"        android:interpolator="@android:anim/accelerate_decelerate_interpolator"        android:pivotX="50%"        android:pivotY="50%"        android:toDegrees="+350" /></set> 

interpolator 指定一个动画的插入器
fromDegrees 属性为动画起始时物件的角度
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
当角度为负数——表示逆时针旋转,当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)(负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转)
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
以上两种属性从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
duration 属性为动画持续时间,单位为毫秒


获取XML中的动画
public static Animation loadAnimation (Context context, int id)
//第一个参数Context为程序的上下文,第二个参数id为动画XML文件的引用
例子:myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action);


在代码中定义动画

AlphaAnimation(float fromAlpha, float toAlpha)//第一个参数fromAlpha为 动画开始时候透明度//第二个参数toAlpha为 动画结束时候透明度Animation myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);   myAnimation_Alpha.setDuration(5000);//设置时间持续时间为 5000毫秒----------ScaleAnimation(float fromX, float toX, float fromY, float toY,            int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) //第一个参数fromX为动画起始时 X坐标上的伸缩尺寸    //第二个参数toX为动画结束时 X坐标上的伸缩尺寸     //第三个参数fromY为动画起始时Y坐标上的伸缩尺寸    //第四个参数toY为动画结束时Y坐标上的伸缩尺寸  //第五个参数pivotXType为动画在X轴相对于物件位置类型  //第六个参数pivotXValue为动画相对于物件的X坐标的开始位置//第七个参数pivotXType为动画在Y轴相对于物件位置类型   //第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置Animation myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,              Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);myAnimation_Scale.setDuration(700);//设置时间持续时间为 700毫秒 ----------RotateAnimation(float fromDegrees, float toDegrees,             int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)//第一个参数fromDegrees为动画起始时的旋转角度    //第二个参数toDegrees为动画旋转到的角度   //第三个参数pivotXType为动画在X轴相对于物件位置类型  //第四个参数pivotXValue为动画相对于物件的X坐标的开始位置//第五个参数pivotXType为动画在Y轴相对于物件位置类型   //第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置Animation myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,                Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);myAnimation_Rotate.setDuration(3000);//设置时间持续时间为 3000毫秒----------RotateAnimation(float fromDegrees, float toDegrees,             int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) //第一个参数fromDegrees为动画起始时的旋转角度    //第二个参数toDegrees为动画旋转到的角度   //第三个参数pivotXType为动画在X轴相对于物件位置类型  //第四个参数pivotXValue为动画相对于物件的X坐标的开始位置//第五个参数pivotXType为动画在Y轴相对于物件位置类型   //第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,                Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);myAnimation_Rotate.setDuration(3000);//设置时间持续时间为 3000毫秒 ----------使用动画:View.startAnimation(animation); //View组件使用动画 
1 0
原创粉丝点击