经过初识属性动画——使用Animator创建动画和再谈属性动画——介绍以及自定义Interpolator插值器,对属性动画已经介绍的差不多了,还剩下最后两个概念,Keyframe和ViewPropertyAnimator ViewPropertyAnimator 如果想在一个View上使用属性动画,可以这么操作: val animX = ObjectAnimator.ofFloat(myView, "x", 50f)val View作为最常被动画的对象,Android提供了一种封装,这就是ViewPropertyAnimator,使用方式也是很简单,比如上面的代码等效于: myView.animate().x(50f).y (100f) View.animate()方法会返回一个ViewPropertyAnimator,该对象具备View的常用属性的变换,比如: transitionX、transitionY、transitionZ developer.android.google.cn/reference/android/animation/Keyframe https://developer.android.google.cn/reference/android/view/ViewPropertyAnimator
mAnimator = new ViewPropertyAnimator(this); } return mAnimator; } 这个方法里会去创建一个 ViewPropertyAnimator 好了,流程上已经梳理清理了,接下去就是细节问题了,ViewPropertyAnimator 取得了每一帧对应的动画进度时又是如何进行的 ui 操作的呢? 所以,下面就先看看第一个步骤,跟着 scaleX() 进去看看: //ViewPropertyAnimator#scaleX() public ViewPropertyAnimator scaleX(float 总结 最后,就来进行一下总结: View.animate() 这种方式实现的动画其实是 ViewPropertyAnimator 动画。 所以到最后,ViewPropertyAnimator 内部的流程和原理虽然已经清楚了,但具体要不要将这个动画归纳到属性动画中,我就不大清楚了。
ViewPropertyAnimator的用法 ViewPropertyAnimator其实算不上什么高级技巧,它的用法格外的简单,只不过和前面所学的所有属性动画的知识不同,它并不是在3.0系统当中引入的 那么下面我们就来看一下如何使用ViewPropertyAnimator来实现同样的效果,ViewPropertyAnimator提供了更加易懂、更加面向对象的API,如下所示: textview.animate 比起使用ObjectAnimator,ViewPropertyAnimator的用法明显更加简单易懂吧。 那么除了用法之外,关于ViewPropertyAnimator有几个细节还是值得大家注意一下的: 整个ViewPropertyAnimator的功能都是建立在View类新增的animate()方法之上的 ,这个方法会创建并返回一个ViewPropertyAnimator的实例,之后的调用的所有方法,设置的所有属性都是通过这个实例完成的。
public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); } }); ---- ViewPropertyAnimator 上手 属性动画是谷歌在android3.0引入的, 而ViewPropertyAnimator则是3.1引入的, 这个ViewPropertyAnimator绝对可以说是个磨人的小妖精, 它绝对会让你爱上属性动画的 ViewPropertyAnimator栗子 用ViewPropertyAnimator的目的就是精简代码以及快速实现, 想要处理一些复杂的动画, 还是要用上一篇说的内容慢慢来的(滑稽脸). 好, 我们再来看一个及其经典的代码, 可以完美展现出ViewPropertyAnimator的精简好用: view.animate()// 获取ViewPropertyAnimator对象
() 和 ViewPropertyAnimator.translationXBy() 这两个方法。 设置监听器的方法, ViewPropertyAnimator 和 ObjectAnimator 略微不一样: ViewPropertyAnimator 用的是 setListener() 和 setUpdateListener 由于 ViewPropertyAnimator 不支持重复,所以这个方法对 ViewPropertyAnimator 相当于无效。 方法的参数是一个 ValueAnimator,ValueAnimator 是 ObjectAnimator 的父类,也是 ViewPropertyAnimator 的内部实现,所以这个参数其实就是 ViewPropertyAnimator 3.3 ViewPropertyAnimator.withStartAction/EndAction() 这两个方法是 ViewPropertyAnimator 的独有方法。
ViewPropertyAnimator: ? 我直接引用了扔物线大佬文章里面的相关动画操作的图片: ? 用ViewPropertyAnimator 来做属性动画是最简单的。特别方便。 ViewPropertyAnimator多个动画进行: 如果想多个动画同时进行,只需要简单的: view.animate() .scaleX(1) .scaleY(1) ViewPropertyAnimator 和 ObjectAnimator的底部都是用ValueAnimator实现的,从字面意思就可以看出是数值的动画,也就是数值的变化。 所以你看,ViewPropertyAnimator、ObjectAnimator、ValueAnimator 这三种 Animator,它们其实是一种递进的关系:从左到右依次变得更加难用,也更加灵活。 但我要说明一下,它们的性能是一样的,因为 ViewPropertyAnimator 和 ObjectAnimator 的内部实现其实都是 ValueAnimator,ObjectAnimator 更是本来就是
} }); } else { //将item滑动至开始位置 ViewPropertyAnimator.animate 我这里要说说ViewPropertyAnimator类,这个类能更好的实现一个View同时进行多个动画的功能,当然我们也可以使用ObjectAnimator利用AnimatorSet来实现一个View上的多个同时进行的动画效果 ,例如我们可以将 ViewPropertyAnimator.animate(mDownView) .translationX(dismissRight ? 在性能上要比使用ObjectAnimator来实现多个同时进行的动画要高的多,举个例子,假如要对View使用移动和透明度的动画,使用ViewPropertyAnimator的话,某个时间点上我们只需要调用一次 invalidate()方法刷新界面就行了,而使用ObjectAnimator的话,移动的动画需要调用invalidate(),透明度的动画也需要调用invalidate()方法,在性能上使用AnimationSet比ViewPropertyAnimator
interpolator,以上几个都是实现了这个接口 ###PropertyValuesHolder 如果要实现一个对象不同属性的动画效果,除了Set,我们还可以利用PropertyValuesHolder和ViewPropertyAnimator Calls to {@link android.view.View#animate()} will return a reference to the appropriate ViewPropertyAnimator object for that View.` 如果需要对一个View的多个属性进行动画可以用ViewPropertyAnimator类,该类对多属性动画进行了优化,会合并一些invalidate()来减少刷新视图 view.animate()方法会返回ViewPropertyAnimator类。 并且这个机制对于组合动画也同样有效,只要我们不断地添加新的方法,那么动画就不会立刻执行,等到所有在ViewPropertyAnimator上设置的方法都执行完毕后,动画就会自动启动。
如果使用 ViewPropertyAnimator,你可以直接用连写的方式来在一个动画中同时改变多个属性: view.animate() .scaleX(1) .scaleY 除了 ViewPropertyAnimator 和 ObjectAnimator,还有第三个选择是 ValueAnimator。ValueAnimator 并不常用,因为它的功能太基础了。 所以你看,ViewPropertyAnimator、ObjectAnimator、ValueAnimator 这三种 Animator,它们其实是一种递进的关系:从左到右依次变得更加难用,也更加灵活。 但我要说明一下,它们的性能是一样的,因为 ViewPropertyAnimator 和 ObjectAnimator 的内部实现其实都是 ValueAnimator,ObjectAnimator 更是本来就是
参考资料,下面其它文章不再重复声明: Android开发艺术探索 Android高级进阶 Animation Resources Start an Activity with an Animation ViewPropertyAnimator
,提供 getter/setter 方法,方法内部进行转变使得能够设置到属性上 使用 ValueAnimator,只计算,然后加 AnimatorUpdateListener,在监听里自己去改变效果 ViewPropertyAnimator ViewPropertyAnimator 提供了一种可以使多个属性同时做动画的简单方法,而且它在内部只使用一个 Animator。
上),初识属性动画的基本用法、Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法和Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator 上),初识属性动画的基本用法 Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法 Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator
animateAddImpl(final ViewHolder holder) { final View view = holder.itemView;//获取布局视图 final ViewPropertyAnimator onAnimationStart(Animator animator) { view.setAlpha(1); ---- 1.2.2抖动 缩放抖动 移动抖动 感觉ViewPropertyAnimator = 0) { view.animate().translationY(0); } final ViewPropertyAnimator animation = view.animate
show(child); } } } private void hide(final View view) { ViewPropertyAnimator } }); animator.start(); } private void show(final View view) { ViewPropertyAnimator show(child); } } //隐藏时的动画 private void hide(final View view) { ViewPropertyAnimator }); animator.start(); } //显示时的动画 private void show(final View view) { ViewPropertyAnimator
animator 并指定你想动画化的 View 对象的属性就可以将其动画化了,例如: ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f); 使用 ViewPropertyAnimator 进行动画化 # ViewPropertyAnimator 类提供了一个简单的方法来并行地动画化一个 View 对象的多个属性,并且在底层只用到了一个 Animator 对象。 而且,使用 ViewPropertyAnimator 的代码会更加清晰易读。 下面的代码片段展示了使用多个 ObjectAnimator、使用一个 ObjectAnimator 以及使用 ViewPropertyAnimator 来同时动画化地改变 View 对象的 x 和 y PropertyValuesHolder.ofFloat("y", 100f); ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start(); 使用 ViewPropertyAnimator
} }); // Start the animation animator.start(); If you're on minSdkVersion 16+ and you're using ViewPropertyAnimator
v.setAnimation(null); } /** * Returns true if the API level supports canceling existing animations via the * ViewPropertyAnimator false if it does not * @return true if the API level supports canceling existing animations via the * ViewPropertyAnimator
可以像这样来获得一个对View进行旋转的动画: ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f); ViewPropertyAnimator 如果一次同时修改一个对象的若干属性 ,那么ViewPropertyAnimator提供了一种便捷的方式。 PropertyValuesHolder.ofFloat("y", 100f); ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start(); ViewPropertyAnimator
AnimationSet和Animatorset 一般来说,Android实现动画组合有四种方式,分别是: AnimationSet AnimatorSet PropertyValuesHolder ViewPropertyAnimator
使用ViewPropertyAnimator替代 view.animate() .alpha(1f) .setListener(null) // 默认无监听器 .withEndAction