属性动画PropertyAnimation
简介
帧动画与补间动画实现了对View进行移动、缩放、旋转和淡入淡出的效果。但对于android开发师来说是不够的,同时移动、缩放、旋转和淡入淡出的效果也不再只是一种视觉上的动画效果了。所以从Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation)。
1、概述:
- 属性动画是android3.0以后提供的一种动画实现机制,它可以作用于任何对象,对对象的属性赋值修改,从而实现动画效果。
- 实现原理:在一定的时间内,通过插值器(动画改变的趋势)与估值器(动画具体变化的数值),不断改变对象的属性,实现动画的效果。
2、与补间动画不同点:
- 补间动画只改变view的绘制位置,不改变view的属性,比如位置、宽高。所见非所得
- 属性动画不仅改变view的绘制位置,还改变对象的属性。所见即所得
3、重要类:
- Animator: 动画的超类,实现了动画的开始结束等状态,以及添加监听。
- AnimatorSet: 继承Animator,动画的组合类,用于制作一组动画,设置动画执行的先后顺序。
- ValueAnimator: 继承Animator,动画的执行类。
- ObjectAnimator: 继承ValueAnimator,动画的执行类。
- TypeEvaluator: 类型估值,用于设置动画属性的值。
- TimeInterpolator: 时间插值,用于设置动画的改变趋势。
- AnimatorInflater: 加载属性动画的xml文件
4、实现方式
1、xml方式:将动画代码写在xml文件
可参照:https://blog.csdn.net/ws614054446/article/details/81289377
2、java代码:
ValueAnimator animator = ValueAnimator.ofFloat(0, num); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { if(animation!=null&&animation.getAnimatedValue()!=null){ float animatedValue = (float)animation.getAnimatedValue(); WindowManager.LayoutParams params = MascotVrCsdManager.getInstance().getLayoutParams(); float startx= 73 ,startY= 148 ,endx = 64 , endY = 18; float xx = (startx + (endx - startx) * (animatedValue / num)); params.x = (int)xx; float yy = (startY + (endY - startY) * (animatedValue / num)); params.y = (int)yy; WindowManager windowManager = MascotVrCsdManager.getInstance().getwindow(); if(view.isAttachedToWindow()){ windowManager.updateViewLayout(view,params); }else { animator.cancel(); } } }); animator.setDuration(duration); animator.start();
5、补充 ViewPropertyAnimator
直接通过View的animate()方法,执行动画
//初始化Y轴的偏移量 mainView.translationY = WINDOW_HEIGHT.toFloat() mainView.animate().setInterpolator(PhysicBasedInterpolator(0.99f, 0.76f)).setDuration(500).translationY(0f).setListener(object : MyAnimatorListener() { override fun onAnimationEnd(p0: Animator?) { LogUtils.i(TAG, "打开的动画结束了") } }).start()
区别一:需要的Anroid API level不一样
Property Animation需要Android API level 11的支持,而View Animation则是更早期的版本。
区别二:适用范围不一样
Property Animation适用于所有的Object对象,而View Animation则只能应用于View对象。
区别三:XML声明结构、存放目录不一样
Property Animation的XML声明文件存放在res/animator目录下,而View Animation则存放在res/anim目录。具体的XML结构可以查看Animation Resources
区别四:类的继承结构不一样
Property Animation基于Animator和AnimatorSet的类结构,而View Animation则基于Animation和AnimationSet的类结构。