首页 > 学院 > 开发设计 > 正文

定义控件三部曲之动画篇(三)—— 代码生成alpha、scale、translate、rotate、set及插值器动画

2019-11-06 09:37:49
字体:
来源:转载
供稿:网友

  转:定义控件三部曲之动画篇(三)—— 代码生成alpha、scale、translate、rotate、set及插值器动画

前言:我相信信念的力量,只要每天进步,总有一天,会与众不同。转到JACA以后,发现真的有好多知识要补充,不再像c++那样,只要深入学习就好,这里没有了深入,却要求知识面很广范。先把Android的知识补充完以后,再看android的书籍,最后深入学习java,两年的时候应该来得急,努力。

不登高山,不知天之高;不临深溪,不知地之厚

相关文章:

《Android自定义控件三部曲文章索引》

一、概述

前两篇,我为大家讲述了利用xml来定义动画及插值器,但在代码中,我们常常是动态生成动画的,所以,这篇将为大家讲述如何用代码生成动态生成动画及插值器。

先简单写出各个标签对应的类,方便大家理解:

scale —— ScaleAnimationalpha —— AlphaAnimationrotate —— RotateAnimationtranslate —— TranslateAnimationset —— AnimationSet

二、Animation公共类

官方SDK讲解页面为:《Animation》

第一篇中我们提到过,Animation类是所有动画(scale、alpha、translate、rotate)的基类,它所具有的标签及对应函数为:

android:duration                  setDuration(long) 动画持续时间,以毫秒为单位 android:fillAfter                    setFillAfter(boolean)如果设置为true,控件动画结束时,将保持动画最后时的状态android:fillBefore                 setFillBefore(boolean)如果设置为true,控件动画结束时,还原到开始动画前的状态android:fillEnabled              setFillEnabled(boolean)与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态android:repeatCount           setRepeatCount(int)重复次数android:repeatMode            setRepeatMode(int)重复类型,有reverse和restart两个值,取值为RESTART或 REVERSE,必须与repeatCount一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。android:interpolator            setInterpolator(Interpolator) 设定插值器,其实就是指定的动作效果,比如弹跳效果等

在第一篇《 Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法》 我们已经讲解了每个标签具体所具有的功能,这里就不再细讲,对于使用方法会在下面的各标签中使用。

三、ScaleAnimation

这是scale标签对应的类,官方SDK页面为:《ScaleAnimation》

在Scale标签中,我们提到过它的自有属性有下面几条,先列一下:

android:fromXScale    起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍;android:toXScale        结尾的X方向上相对自身的缩放比例,浮点值;android:fromYScale    起始的Y方向上相对自身的缩放比例,浮点值,android:toYScale        结尾的Y方向上相对自身的缩放比例,浮点值;android:pivotX            缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,当为数值时,表示在当前View的左上角,即原点处加上50px,做为起始缩放点;如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标。(具体意义,后面会举例演示)android:pivotY           缩放起点Y轴坐标,取值及意义跟android:pivotX一样。放到代码中,ScaleAnimation有下面几个构造函数:ScaleAnimation(Context context, AttributeSet attrs)  从XML文件加载动画,基本用不到ScaleAnimation(float fromX, float toX, float fromY, float toY)ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)第一个构造函数是从本地XML文件加载动画,基本用不到的,我们主要看下面三个构造函数。

在标签属性android:pivotX中有三种取值,数,百分数,百分数p;体现在构造函数中,就是最后一个构造函数的pivotXType,它的取值有三个,Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT;

这三个构造函数难度不大,就不再细讲,举个例子说明:

在第一篇中Scale的例子的XML代码为:

[html] view plain copy 在CODE上查看代码片<?xml version="1.0" encoding="utf-8"?>  <scale xmlns:android="http://schemas.android.com/apk/res/android"      android:fromXScale="0.0"      android:toXScale="1.4"      android:fromYScale="0.0"      android:toYScale="1.4"      android:pivotX="50"      android:pivotY="50"      android:duration="700" />  

对应的代码构造代码为:

[java]%20view%20plain%20copy%20scaleAnim = new ScaleAnimation(0.0f,1.4f,0.0f,1.4f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);  scaleAnim.setDuration(700);  在控件使用的时候,同样是使用:[java]%20view%20plain%20copy%20tv.startAnimation(scaleAnim);  

四、AlphaAnimation

这是alpha标签对就的类,官方SDK文档地址是:《AlphaAnimation》同样alpha标签自有的属性有:android:fromAlpha  %20动画开始的透明度,从0.0%20--1.0%20,0.0表示全透明,1.0表示完全不透明android:toAlpha%20 %20   %20动画结束时的透明度,也是从0.0%20--1.0%20,0.0表示全透明,1.0表示完全不透明所对应的构造函数为:AlphaAnimation(Context%20context,%20AttributeSet%20attrs)%20 同样,从本地XML加载动画,基本不用AlphaAnimation(float%20fromAlpha,%20float%20toAlpha)这里只剩最后一个构造函数,难度不大,下面举个例子说明下用法。

在第一篇文章中,我们构造的XML代码为:

[java]%20view%20plain%20copy%20<?xml version="1.0" encoding="utf-8"?>  <alpha xmlns:android="http://schemas.android.com/apk/res/android"      android:fromAlpha="1.0"      android:toAlpha="0.1"      android:duration="3000"      android:fillBefore="true">  </alpha>  如果用代码构造同样的效果,它所对应的代码为:[java]%20view%20plain%20copy%20alphaAnim = new AlphaAnimation(1.0f,0.1f);  alphaAnim.setDuration(3000);  alphaAnim.setFillBefore(true);  

五、RotateAnimation

RotateAnimation类对应Rotate标签,SDK文档地址:《RotateAnimation》

Rotate标签所具有的XML属性有:

android:fromDegrees  %20 %20开始旋转的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数android:toDegrees  %20 %20 %20 %20结束时旋转到的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数android:pivotX  %20 %20 %20 %20 %20 %20 %20缩放起点X轴坐标,可以是数值、百分数、百分数p%20三种样式,比如%2050、50%、50%p,具体意义已在scale标签中讲述,这里就不再重讲android:pivotY  %20 %20 %20 %20 %20 %20 %20缩放起点Y轴坐标,可以是数值、百分数、百分数p%20三种样式,比如%2050、50%、50%p对应的构造函数有:RotateAnimation(Context%20context,%20AttributeSet%20attrs)  从本地XML文档加载动画,同样,基本不用RotateAnimation(float%20fromDegrees,%20float%20toDegrees)RotateAnimation(float%20fromDegrees,%20float%20toDegrees,%20float%20pivotX,%20float%20pivotY)RotateAnimation(float%20fromDegrees,%20float%20toDegrees,%20int%20pivotXType,%20float%20pivotXValue,%20int%20pivotYType,%20float%20pivotYValue)

RotateAnimation跟ScaleAnimation差不多,关键问题同样是pivotXType和pivotYType的选择,同样有三个取值:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT;

根据每一篇中的XML写出对应的JAVA构造代码:

XML为:

[java]%20view%20plain%20copy%20<?xml version="1.0" encoding="utf-8"?>  <rotate xmlns:android="http://schemas.android.com/apk/res/android"      android:fromDegrees="0"      android:toDegrees="-650"      android:pivotX="50%"      android:pivotY="50%"      android:duration="3000"      android:fillAfter="true">        </rotate>  对应JAVA构造代码为:[java]%20view%20plain%20copy%20rotateAnim = new RotateAnimation(0, -650, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  rotateAnim.setDuration(3000);  rotateAnim.setFillAfter(true);  

六、TranslateAnimation

很显示TranslateAnimation类对应translate标签,它的SDK官方文档地址为:《TranslateAnimation》

translate标签所具有的属性为:

android:fromXDelta  %20 %20起始点X轴坐标,可以是数值、百分数、百分数p%20三种样式,比如%2050、50%、50%p,具体意义已在scale标签中讲述,这里就不再重讲android:fromYDelta  %20 起始点Y轴从标,可以是数值、百分数、百分数p%20三种样式;android:toXDelta%20   %20 %20 %20结束点X轴坐标android:toYDelta  %20 %20 %20 结束点Y轴坐标这些属性所对应的构造函数为:TranslateAnimation(Context%20context,%20AttributeSet%20attrs)%20 同样,基本不用TranslateAnimation(float%20fromXDelta,%20float%20toXDelta,%20float%20fromYDelta,%20float%20toYDelta)TranslateAnimation(int%20fromXType,%20float%20fromXValue,%20int%20toXType,%20float%20toXValue,%20int%20fromYType,%20float%20fromYValue,%20int%20toYType,%20float%20toYValue)

由于fromXDelta、fromYDelta、toXDelta、toYDelta这三个属性都具有三种状态,所以在构造函数中,最理想的状态就是第三个构造函数,能够指定每个值的类型,第二个构造函数:TranslateAnimation%20(float%20fromXDelta,%20float%20toXDelta,%20float%20fromYDelta,%20float%20toYDelta)使用是绝对数值。只有最后一个构造函数可以指定百分数和相对父控件的百分数。

下面以第一篇中的XML代码为例,用JAVA代码构造同样的效果:

XML代码:

[html]%20view%20plain%20copy%20<?xml version="1.0" encoding="utf-8"?>  <translate xmlns:android="http://schemas.android.com/apk/res/android"      android:fromXDelta="0"       android:toXDelta="-80"      android:fromYDelta="0"      android:toYDelta="-80"      android:duration="2000"      android:fillBefore="true">  </translate>  对应的JAVA代码为:[html]%20view%20plain%20copy%20translateAnim = new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, -80,           Animation.ABSOLUTE, 0, Animation.ABSOLUTE, -80);  translateAnim.setDuration(2000);  translateAnim.setFillBefore(true);  

七:AnimationSet

AnimationSet类对应set标签,定义动作类的集合,对应的SDK文档地址为:《AnimationSet》它自己是没有XML属性的,所以我们直接说它的构造函数:AnimationSet(Context%20context,%20AttributeSet%20attrs)%20 同样,基本不用AnimationSet(boolean%20shareInterpolator)%20 shareInterpolator取值true或false,取true时,指在AnimationSet中定义一个插值器(interpolater),它下面的所有动画共同。如果设为false,则表示它下面的动画自己定义各自的插值器。

增加动画的函数为:(更多函数,请参看SDK文档)

public%20void%20addAnimation%20(Animation%20a)

下面在第一篇中的XML代码为例写出能构造同样效果的JAVA代码:

XML代码为:

[html]%20view%20plain%20copy%20<?xml version="1.0" encoding="utf-8"?>  <set xmlns:android="http://schemas.android.com/apk/res/android"      android:duration="3000"      android:fillAfter="true">          <alpha       android:fromAlpha="0.0"      android:toAlpha="1.0"/>        <scale      android:fromXScale="0.0"      android:toXScale="1.4"      android:fromYScale="0.0"      android:toYScale="1.4"      android:pivotX="50%"      android:pivotY="50%"/>        <rotate      android:fromDegrees="0"      android:toDegrees="720"      android:pivotX="50%"      android:pivotY="50%"/>           </set>  对应的JAVA代码为:[java]%20view%20plain%20copy%20alphaAnim = new AlphaAnimation(1.0f,0.1f);  scaleAnim = new ScaleAnimation(0.0f,1.4f,0.0f,1.4f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);  rotateAnim = new RotateAnimation(0, 720, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);    setAnim=new AnimationSet(true);  setAnim.addAnimation(alphaAnim);  setAnim.addAnimation(scaleAnim);  setAnim.addAnimation(rotateAnim);    setAnim.setDuration(3000);  setAnim.setFillAfter(true);  

八、Interpolater插值器

关于插值器的效果及应用,我们专门开了一篇来讲,看这里:《Animation动画详解(二)——Interpolator插值器》

关于插值器的SDK讲解见《Animation%20Resources》中的Interpolators部分;

插值器XML属性及对应的类如下表所示:

Interpolator%20classResource%20IDAccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolatorAccelerateInterpolator@android:anim/accelerate_interpolatorAnticipateInterpolator@android:anim/anticipate_interpolatorAnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolatorBounceInterpolator@android:anim/bounce_interpolatorCycleInterpolator@android:anim/cycle_interpolatorDecelerateInterpolator@android:anim/decelerate_interpolatorLinearInterpolator@android:anim/linear_interpolatorOvershootInterpolator@android:anim/overshoot_interpolator

使用方法:(为sacleAnimation增加bounce插值器)

[java]%20view%20plain%20copy%20ScaleAnimation interpolateScaleAnim=new ScaleAnimation(0.0f,1.4f,0.0f,1.4f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);  interpolateScaleAnim.setInterpolator(new BounceInterpolator());  interpolateScaleAnim.setDuration(3000);  

九、示例,源码

下面我把上面所有的代码集合到一个例子中,供大家下载;

效果图如下:

   

源码下载地址:http://download.csdn.net/detail/harvic880925/8047669

请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/40117115 谢谢!

如果我的文章有帮到您,记得加关注哦!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表