Android中的tween动画, 帧动画, 和3.0以后的属性动画的用法及不同!

本博客是查看了guolin大大的动画3篇,自己想总结收拾变成自己的东西所以写的.如有雷同,你们懂~
在android中,总所周知动画的形式有3种, 一种是tweened-animation(补间动画)渐变动画.一种是frame-by-frame animation(帧动画),最后一种是Andorid3.0开始的property animation(属性动画),其实在android中动画的效果已经很齐全了. 为什么在3.0以后的安卓中又要加上这个属性动画呢? 我们常说的事物出现就有其自然规律.也是在android中我们可以用tweened动画.来实现一个视图View的旋转/平移/缩放/淡入淡出/和控制动画播放速度等效果.不过不知道你们注意过没有就是补间动画tweened-animation改变的只是UI效果, 但是在android随着发展这就已经不够我们日益增多的功能效果的要求了. 于是属性动画应运而生. 属性动画最本质的改变就是在补间动画的基础上实现了tweened动画的效果, 然后也改变里面的具体属性.比如说一个button(按钮)把它移动到任意其他的地方,你会发现在补间动画中,按钮的触发效果还是原先的初始的地点, 而属性动画完成的效果就是按钮出现什么地方,它的点击响应就在哪里!
–注意上面我在介绍补间动画的时候都有使用“对View进行操作”这样的描述,没错,补间动画是只能够作用在View上的。也就是说,我们可以对一个Button、TextView、甚至是LinearLayout、或者其它任何继承自View的组件进行动画操作,但是如果我们想要对一个非View的对象进行动画操作,抱歉,补间动画就帮不上忙了。可能有的朋友会感到不能理解,我怎么会需要对一个非View的对象进行动画操作呢?这里我举一个简单的例子,比如说我们有一个自定义的View,在这个View当中有一个Point对象用于管理座标,然后在onDraw()方法当中就是根据这个Point对象的座标值来进行绘制的。也就是说,如果我们可以对Point对象进行动画操作,那么整个自定义View的动画效果就有了。显然,补间动画是不具备这个功能的,这是它的第一个缺陷。–这一段不是很懂.

属性动画机制已经不再是针对于View来设计的了,也不限定于只能实现移动、缩放、旋转和淡入淡出这几种动画操作,同时也不再只是一种视觉上的动画效果了。它实际上是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性。所以我们仍然可以将一个View进行移动或者缩放,但同时也可以对自定义View中的Point对象进行动画操作了。我们只需要告诉系统动画的运行时长,需要执行哪种类型的动画,以及动画的初始值和结束值,剩下的工作就可以全部交给系统去完成了。

属性动画的使用分享.
ValueAnimator value = ValueAnimator.ofFloat(0f, 1f )
anim.setDuration(300);//设置动画时长
//添加动画监听,
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
Log.d("TAG", "cuurent value is " + currentValue);
}
});
anim.start();
//开启动画

在andorid中经常使用的方法是ObjectAnimator , 它可以对任意对象进行操作. 例如view的alpha(透明)

ObjectAnimator animator = ObjectAnimator.ofFloat(textview,
//第一个参数传入操作的控件,参数2:是具体动画, 参数3~5:从开始到结束,到停止时的一个展示;
"alpha", 1f, 0f, 1f);
animator.setDuration(5000);//设置时长5秒,然后开启动画
animator.start();

其他的也都是一样操作.只要把传入的具体动画修改成
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
这样就可以实现旋转的动画效果.

那么如果想要将TextView先向左移出屏幕,然后再移动回来,就可以这样写:

float curTranslationX = textview.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX);
animator.setDuration(5000);
animator.start();
这里我们先是调用了TextView的getTranslationX()方法来获取到当前TextView的translationX的位置,然后ofFloat()方法的第二个参数传入"translationX",紧接着后面三个参数用于告诉系统TextView应该怎么移动

最后有一个属性动画的集合类,组合动画:
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();

最后我们这个属性动画都是可以设置一个监听.来查看动画是否实现.OnListener()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章