Android动画创建方式
这里记录一下属性动画
1.通过ViewPropertyAnimator创建
ViewPropertyAnimator animate = imageView.animate();
animate.translationX(50000).setDuration(10000);
imageView.animate获取到ViewPropertyAnimator对象,translationX是向X轴平移 ,setDuration是设置时长,也就是完成本次动画花费的时间,还有其他的api如下
文章图片
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.添加动画的监听 设置监听器的方法,
ViewPropertyAnimator
和 ObjectAnimator
略微不一样: 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 毫秒,动画的完成度更新时),这个方法被调用。
方法的参数是一个
ValueAnimator
,ValueAnimator
是 ObjectAnimator
的父类,也是 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动画创建方式】
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- django-前后端交互
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- IDEA|IDEA 创建工程