Android中的动画--笔记
android中的动画分 View Animation和Property Animation两大类
View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画);
Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;
Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。
Property Animation 包括ValueAnimator和ObjectAnimator;
Property Animation:属性动画,通过动态地改变对象的属性从而达到动画效果,属性动画为API 11新特性。
属性动画是怎么实现的?
属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等
为什么要有属性动画?
Property Animator能实现补间动画无法实现的功能
View Animation仅能对指定的控件做动画,而Property Animator是通过改变控件某一属性值来做动画的。
补间动画虽能对控件做动画,但并没有改变控件内部的属性值。而Property Animator则是恰恰相反,Property Animator是通过改变控件内部的属性值来达到动画效果的
View Animation和PropertyAnimation有什么不同?
1、引入时间不同:View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才开始有Property Animation相关的API。
2、所在包名不同:View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。
3、动画类的命名不同:View Animation中动画类取名都叫XXXXAnimation,而在Property Animator中动画类的取名则叫XXXXAnimator
Tween Animation有四种形式:
使用方法l alpha 渐变透明度动画效果
l scale 渐变尺寸伸缩动画效果
l translate 画面位置移动动画效果
l rotate 画面旋转动画效果
Tween动画的实现原理
通过view的matrix和alpha变量对view进行修改,但是并不会修改view自身属性。
Frame Animation
Frame Animation是顺序播放事先做好的图像,跟电影类似。不同于animation package,Android SDK提供了另外一个类AnimationDrawable来定义使用Frame Animation。
这里有点不同的是,利用AnimationDrawable实现动画时,本身并没有提供接口来监听动画的状态(开始,结束),需要自己处理。
Property Animation 包括ValueAnimator和ObjectAnimator;
ValueAnimator和ObjectAnimator有什么不同?
ValueAnimator只不过是对值进行了一个平滑的动画过渡,而ObjectAnimator就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的
ObjectAnimator 动画的执行类
为了能让动画直接与对应控件相关联,以使我们从监听动画过程中解放出来,谷歌的开发人员在ValueAnimator的基础上,又派生了一个类ObjectAnimator;
ObjectAnimator做动画,并不是根据控件xml中的属性来改变的,而是通过指定属性所对应的set方法来改变的
(1)、setRotationX、setRotationY与setRotation
setRotationX(float rotationX):表示围绕X轴旋转,rotationX表示旋转度数
setRotationY(rotationY):表示围绕Y轴旋转,rotationY表示旋转度数
setRotation(float rotation):表示围绕Z旋转,rotation表示旋转度数
(2)、setTranslationX与setTranslationY
setTranslationX(float translationX) :表示在X轴上的平移距离,以当前控件为原点,向右为正方向,参数translationX表示移动的距离。
setTranslationY(float translationY) :表示在Y轴上的平移距离,以当前控件为原点,向下为正方向,参数translationY表示移动的距离。
(3)、setScaleX与setScaleY
ObjectAnimatorsetScaleX(float scaleX):在X轴上缩放,scaleX表示缩放倍数
setScaleY(float scaleY):在Y轴上缩放,scaleY表示缩放倍数
ValueAnimator 动画的执行类
这个Animation是针对值的!ValueAnimator不会对控件做任何操作 我们可以给它设定从哪个值运动到哪个值,通过监听这些值的渐变过程来自己操作控件。以前我们曾讲过Scroller类,Scroller类也是不会对控件操作的,也是通过给他设定滚动值和时长,它会自己计算滚动过程,然后我们需要监听它的动画过程来自己操作控件,ValueAnimator的原理与Scroller类相似
第一步:创建ValueAnimator实例
创建实例
ValueAnimator.ofInt创建了一个值从0到400的动画,动画时长是1s
第二步:添加监听
AnimatorListener
AnimatorListener中,主要是监听Animation的四个状态,start、end、cancel、repeat;当动画开始时,会调用onAnimationStart(Animator animation)方法,当动画结束时调用onAnimationEnd(Animator animation),当动画取消时,调用onAnimationCancel(Animator animation)函数,当动画重复时,会调用onAnimationRepeat(Animator animation)函数。
AnimatorUpdateListener
监听动画的实时变化状态三、移除监听
针对AnimatorUpdateListener和AnimatorListener,每个监听器都有两个方法来移除
ValueAnimator和ObjectAnimator除了通过ofInt(),ofFloat(),ofObject()创建实例外,还都有一个ofPropertyValuesHolder()方法来创建实例
PropertyValuesHolder 这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值
AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
插值器
插值器,也叫加速器 是用来控制动画区间的值被如何计算出来的Interpolator 属性是Animation类的一个XML属性 所以alpha、scale、rotate、translate、set都会继承得到这个属性。Interpolator被译为插值器 其实他是一个指定动画如何变化的东东,跟PS里的动作有点类似
Evaluator 就是将从加速器返回的数字进度转成对应的数字值。
Evaluator 其实就是一个转换器,他能把小数进度转换成对应的数值位置
二、scale标签 缩放(从控件中心点,从0放大到1.4倍,保持结束时的状态)
三、rotate标签 旋转(从控件中心点,从0放大到1.4倍,保持结束时的状态)
四、alpha标签 (将透明度从0变成1.0)
五、translate标签 位移(把控件从(0,0)平移到(-200,-200)的位置,保持结束时状态不变)
Animation类是所有动画(scale、alpha、translate、rotate)的基类,
ScaleAnimation 缩放
AlphaAnimation 透明度
RotateAnimation 旋转
TranslateAnimation 位移
AnimationSet 定义动作类的集合 它是没有XML属性的
同样效果的JAVA代码alphaAnim =newAlphaAnimation(1.0f,0.1f);
scaleAnim =newScaleAnimation(0.0f,1.4f,0.0f,1.4f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnim =newRotateAnimation(0,720, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f);
setAnim=newAnimationSet(true);
setAnim.addAnimation(alphaAnim);
setAnim.addAnimation(scaleAnim);
setAnim.addAnimation(rotateAnim);
setAnim.setDuration(3000);
setAnim.setFillAfter(true);
AnimatorInflater 用户加载属性动画的xml文件
TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
TimeInterpolator 时间插值,上面已经介绍。