Animation Property Animation 使用

本篇主要讲Animation 和Property Animation的使用,最后会讲QQ管家桌面火箭作为例子:

在Android中开发动效有两套框架可以使用,分别为 Animation 和Property Animation;

相对来说,Animator比Animation要强大太多,两者之间的主要区别在于:

区别一:需要的Anroid API level不一样

Property Animation需要Android API level 11的支持,当然可以使用nineoldandroids.jar进行兼容,而View Animation则是最原始的版本。

区别二:适用范围不一样

Property Animation适用于所有的Object对象,而View Animation则只能应用于View对象。

区别三,实际改变不一样:

Animation:改变的是view的绘制位置,而非实际属性;

Property Animation:改变的是view的实际属性;

如:用两套框架分别对一个button做位移动画,用animation处理之后的点击响应会在原处,而用Property Animation处理后的点击响应会在最终位置处;

一:Animation

总的来说可以分为:Tween Animation(补间动画) 和Frame Animation(帧动画)

帧动画(Frame Animation):

帧动画其实就是按照一定的时间间隔进行快速的图片切换,达到视觉上的动画效果,这种动画相对来说缺点较多,比如:

1.根据动画的复杂度需要切多张图,这样就不可避免的增大了包大小

2.由于是多张图,运行时需要加载到内存,那么又会增大运行时的内存大小

所以如果在动效上有别的方案选择,个人不太建议使用帧动画的实现方式,当然有时候不得不用,这时我们可以尽可能的在效果连贯的基础上减少图片张数;

帧动画的实现也相对简单,就举一个例子,但是例子之中有几条帧动画的使用规则,是我以前在使用的过程中遇到问题后总结出来的;

1.在drawable目录下xml中定义如下文件,节点为animation-list,oneshot代表是否执行一次,duration代表每张图对应展示时间:

<animation-list xmlns:android=""android:oneshot="true"><item android:drawable="@drawable/rocket_thrust1" android:duration="200" /><item android:drawable="@drawable/rocket_thrust2" android:duration="200" /><item android:drawable="@drawable/rocket_thrust3" android:duration="200" /></animation-list>

2.然后将该drawable设置给对应的imageview

3.在activity中animDrawable = (AnimationDrawable) imageView.getBackground();

4.在onWindowFocusChanged()中调用:

animDrawable.stop();

animDrawable.start();

如果不这么做,那么在性能比较差的机器上很可能就会出现没有播放的情况,因为只显示出了第一帧,问题在于动画没有和view完成关联,所以不要在onCreate中去调用启动,而需要在onWindowFocusChanged中进行调用;

在极特殊的情况下如果还无法播放,则可以mHandler.postDelay 200 毫秒作为终极杀手锏,当然只要按照我上面的步骤,应该不会出现问题;

好了,帧动画最大的问题是按照上面的步骤开发,接下来看补间动画(Tween Animation)

补间动画(Tween Animation):

Animation下有五个子类:AlphaAnimation(渐变),RotateAnimation(旋转),ScaleAnimation(缩放),TranslateAnimation(位移)

在实现原理上除了AlphaAnimation是动态的去改变view的alpha值,其他三个都是去改变里面的Matrix(矩阵,后面会专门讲);

在Animation框架里,主要的类主要有Animation和Transformation、Interpolator(插值器,后面也会专门讲)

Transformation里面主要对alpha和matrix进行了封装,而改变view的透明度就是改变alpha,移动、旋转、缩放甚至错切则都是改变matrix

Animation里有一个重要的方法applyTransformation,实现自定义Animation也主要是实现这个方法:

以AlphaAnimation为例:

/*** Changes the alpha property of the supplied {@link Transformation}*/@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {final float alpha = mFromAlpha;t.setAlpha(alpha + ((mToAlpha – alpha) * interpolatedTime));}

渐变动画只需要在里面根据当前的interpolatedTime(已经由插值器转换后的值)动态计算出对应的alpha,重新设置到Transformation中即可;

Animation的使用也相对比较简单,可以通过xml配置,也可以通过代码生成:

1.xml配置:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android=""android:shareInterpolator="false" ><scale><!– 单次运行时间 –>android:duration="500"<!– 运行完成后是否保持结束时的状态 –>android:fillAfter="true"<!– 运行完成后是否回到开始时的状态 –>android:fillBefore="false"<!– 初始时大小,1代表原大小,0代表无 –>android:fromXScale="1"android:fromYScale="1"<!– 使用的插值器,控制运行过程中的速率 –>android:interpolator="@android:anim/accelerate_interpolator"<!– 相对中心点,50%代表自身中心,50%p代表相对父view的中心 –>android:pivotX="50%"android:pivotY="50%"<!– 重复的次数,infinite代表永久循环 –>android:repeatCount="infinite"<!– 重复的模式, restart代表重新开始,reverse代表反转–>android:repeatMode="restart"<!– 延迟多久后开始 –>android:startOffset="100"<!– 要到达的缩放比例 –>android:toXScale="0"android:toYScale="0" /></scale><translateandroid:duration="550"<!– 相对当前位置的像素距离 –>android:fromYDelta="300"android:interpolator="@android:anim/accelerate_interpolator"android:toYDelta="0" /><alphaandroid:duration="550"android:fromAlpha="0"android:toAlpha="1" /></set>当要多个效果同时使用时,则如上使用set标签进行组合,在代码中使用如下:Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.app_clean_animation);view.startAnimation(animation);走一个地方停一个地方。在我心里最美好的就是和你一起老在路上,

Animation Property Animation 使用

相关文章:

你感兴趣的文章:

标签云: