Android动画创建方式

这里记录一下属性动画
1.通过ViewPropertyAnimator创建

ViewPropertyAnimator animate = imageView.animate(); animate.translationX(50000).setDuration(10000);

imageView.animate获取到ViewPropertyAnimator对象,translationX是向X轴平移 ,setDuration是设置时长,也就是完成本次动画花费的时间,还有其他的api如下
Android动画创建方式
文章图片

2.通过ObjectAnimator创建 自定义view
ObjectAnimator progress = ObjectAnimator.ofFloat(view, "progress", 0, 95); progress.setDuration(1000); progress.setInterpolator(new LinearInterpolator()); progress.start();

系统的view
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView2, "translationX", 5000); animator.setDuration(2000); animator.start();

使用方式如下:
如果是自定义控件,那么就要自己设置set/get方法
用ObjectAnimator.ofXxx获取Animator
调用start方法执行
系统提供常见的是ofFloat小数类型的,ofInt整数类型的,平移,旋转,缩放,透明度系统已经提供了,直接用对应的Xxx即可,如果是自定义的view,那么是没有set方法,就需要自己去构建set/get方法,并且要在set方法中去调用重绘方法,因为不去重绘的话,set方法set值只是改变了view的属性值,具体的动画需要通知view去更新,setDuration是设置时长,setInterpolator是设置加速器,可以理解为完成本次动画的是匀速,逐渐加速,逐渐减速,先加速再减速等等
3.添加动画的监听 设置监听器的方法, ViewPropertyAnimatorObjectAnimator 略微不一样: ViewPropertyAnimator 用的是 setListener()setUpdateListener() 方法,可以设置一个监听器,要移除监听器时通过 set[Update]Listener(null) 填 null 值来移除;而 ObjectAnimator 则是用 addListener()addUpdateListener() 来添加一个或多个监听器,移除监听器则是通过 remove[Update]Listener() 来指定移除对象。
另外,由于 ObjectAnimator 支持使用 pause() 方法暂停,所以它还多了一个 addPauseListener() / removePauseListener() 的支持;而 ViewPropertyAnimator 则独有 withStartAction()withEndAction() 方法,可以设置一次性的动画开始或结束的监听。
3.1 ViewPropertyAnimator.setListener() / ObjectAnimator.addListener()
这两个方法的名称不一样,可以设置的监听器数量也不一样,但它们的参数类型都是 AnimatorListener,所以本质上其实都是一样的。 AnimatorListener 共有 4 个回调方法:
3.1.1 onAnimationStart(Animator animation)
当动画开始执行时,这个方法被调用。
3.1.2 onAnimationEnd(Animator animation)
当动画结束时,这个方法被调用。
3.1.3 onAnimationCancel(Animator animation)
当动画被通过 cancel() 方法取消时,这个方法被调用。
需要说明一下的是,就算动画被取消,onAnimationEnd() 也会被调用。所以当动画被取消时,如果设置了 AnimatorListener,那么 onAnimationCancel()onAnimationEnd() 都会被调用。onAnimationCancel() 会先于 onAnimationEnd() 被调用。
3.1.4 onAnimationRepeat(Animator animation)
当动画通过 setRepeatMode() / setRepeatCount()repeat() 方法重复执行时,这个方法被调用。
由于 ViewPropertyAnimator 不支持重复,所以这个方法对 ViewPropertyAnimator 相当于无效。
3.2 ViewPropertyAnimator.setUpdateListener() / ObjectAnimator.addUpdateListener()
和上面 3.1 的两个方法一样,这两个方法虽然名称和可设置的监听器数量不一样,但本质其实都一样的,它们的参数都是 AnimatorUpdateListener。它只有一个回调方法:onAnimationUpdate(ValueAnimator animation)
3.2.1 onAnimationUpdate(ValueAnimator animation)
当动画的属性更新时(不严谨的说,即每过 10 毫秒,动画的完成度更新时),这个方法被调用。
方法的参数是一个 ValueAnimatorValueAnimatorObjectAnimator 的父类,也是 ViewPropertyAnimator 的内部实现,所以这个参数其实就是 ViewPropertyAnimator 内部的那个 ValueAnimator,或者对于 ObjectAnimator 来说就是它自己本身。
3.3 ViewPropertyAnimator.withStartAction/EndAction()
这两个方法是 ViewPropertyAnimator 的独有方法。它们和 set/addListener() 中回调的 onAnimationStart() / onAnimationEnd() 相比起来的不同主要有两点:
1. withStartAction() / withEndAction() 是一次性的,在动画执行结束后就自动弃掉了,就算之后再重用 ViewPropertyAnimator 来做别的动画,用它们设置的回调也不会再被调用。而 set/addListener() 所设置的 AnimatorListener 是持续有效的,当动画重复执行时,回调总会被调用。
2. withEndAction() 设置的回调只有在动画正常结束时才会被调用,而在动画被取消时不会被执行。这点和 AnimatorListener.onAnimationEnd() 的行为是不一致的。


【Android动画创建方式】

    推荐阅读