【Android】の基础——Animation

Animation

Android的动画主要分为三种:
1. View Animation视图动画(Tween Animation补间动画)
2. Drawable Animation 帧动画
3. Property Animation 属性动画

View Animation视图动画(补间动画)

对一个View进行简单变换(位置、大小、旋转、透明度)。
关键类:
1. AnimationSet:Animation的容器,盛放一系列Animation。
2. AlphaAnimation:Animation的子类,透明度渐变动画。
3. RotateAnimation:Animation的子类,旋转动画。
4. ScaleAnimation:Animation的子类,大小缩放动画。
5. TranslateAnimation:Animation的子类,位移动画。
每种动画都有多个参数需要设置,设置后要添加到AnimationSet对象中。
补间动画执行之后并未改变View的真实布局属性值。
这种动画可以通过java或者xml实现。

6.插值器Interpolator:定义了动画变化的速率

Drawable Animation帧动画

一帧一帧地显示动画,类似幻灯片。
可以使用xml或者java方式实现帧动画,用xml比较方便。

<animation-list> 必须是根节点,包含一个或者多个<item>元素,属性有:

android:oneshot true代表只执行一次,false循环执行。
<item> 类似一帧的动画资源。
<item> animation-list的子项,包含属性如下:

android:drawable 一个frame的Drawable资源。
android:duration 一个frame显示多长时间。

LayoutAnimationController:可以处理 一个界面中的多个控件,动画方式相同,但是每个控件完成该动画的时刻不同。

Property Animation属性动画

控件的属性值改变实现的动画。

使用属性动画时,被改变的对象必须实现由该属性的get和set方法。如果没有会出现问题,这就需要我们给对象加上get、set方法或者说包装起来提供set和get方法。(当然,如果不通过ObjectAnimator,通过ValueAnimator监听动画过程可以自己实现属性的改变)

插值器和估值器

  1. 插值器
    本质是时间的函数,定义了动画的变化规律(提前/延迟执行默认的时间点来达到加速/减速的效果!)
  2. 估值器
    估值器的是用来决定属性的计算方式,最终使用反射机制来改变属性变化

通过插值器和估值器可以实现非匀速动画。

属性动画原理

先说ValueAnimator(ObjectAnimator的父类):
通过ValueAnimator的AnimatorUpdateListener可以得到动画执行每一帧所返回的值

ofInt或ofFloat方法提供的values最终都被包装成一个PropertyValuesHolder

在ValueAnimator中操作的都是valuesHolder对象

同时也把传入的每一个数据值包装成了一个Keyframe,而KeyframeSet则是在PropertyValueHolder初始化的。

属性动画逐帧更新都是由handler不断发生消息来实现的

在handler逐帧更新代码中,anim.animationFrame(currentTime),是计算动画执行过程中值的变化的

animationValue方法通过插值器重新计算一个fraction
真正属性值的计算是交给PropertyValuesHolder.calculateValue(float fraction)计算,之前我们看到传进来的values值已经被PropertyValuesHolder包装并保存起来了,那么现在我们就可以利用到这些值来进行计算了

这样每一帧都会计算出当前进度的animationValue,而我们根据AnimatorUpdateListener就可以获取每一帧计算过后animationValue值了。

ObjectAnimator与ValueAnimator只有3个地方不同

  1. 提供了Object对象,以及对象的propertyName
  2. 重写initAnimation方法,额外初始化了对应属性的set和get方法
  3. 重写animateValue,把每一帧计算的到的中间值通过set方法传入对象属性中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值