android 中 objectanimator 和 Inter
ValueAnimator:这个动画是针对属性的值进行动画的 ,不会对UI造成改变,不能直接实现动画效果。需要通过对动画的监听去做一些操作,在监听中将这个值设置给对应的属性,对应的属性才会改变。
ObjectAnimator:直接动画所给的对象,他会调用对象对应属性的get/set方法吧属性的值设置给对象的属性,直接实现动画效果。
TimeAnimator:这个也不直接实现动画效果,只是提供一个监听回调,返回动画执行的总时间,距离上次动画执行的时间等。
ValueAnimator中需要在动画变化监听中手动更改对象的属性,是动画的使用有一种分裂的感觉。用动画肯定是像让眼睛能看见的界面动起来的,而不仅仅是让看不见的数值动。ObjectAnimator就把这个过程整合在了一起。
如:ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "scaleX", 0.5f, 1.0f);
ObjectAnimator objectAnimator = ObjectAnimator.ofInt(tvButton, "textColor", 0xffffffff, 0xffff0000);
理解一下ofInt(Object target, String propertyName, int... values)参数:
image.png
propertyName参数的理解:
image.png
Interpolator继承自TimeInterpolator,用来定义动画在不同的时间有不同的速度。也叫插补器。
插值器可以通过在xml文件中用android:interpolator设置,也可以在java中通过animation.setInterpolator()来设置.
在java中设置可以传一些参数,对插值器进行更详细的设置,比较灵活。
插值器 XML中的值 作用
image.png
下面以让一个图片顺时针旋转360度为例,其他动画都类似的作用:
AccelerateDecelerateInterpolator
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"/>
</set>
image.png
其他的大家可以自己试一下.
自定义插值器
public class SpringInterpolator implements Interpolator {
private float factor;
public SpringInterpolator(float factor) {
this.factor = factor;
}
@Override
public float getInterpolation(float input) {
return (float) (Math.pow(2, -10 * input) * Math.sin((input - factor / 4) * (2 * Math.PI) / factor) + 1);
}
}
代码中调用
ObjectAnimator objectAnimator0 = ObjectAnimator.ofFloat(view, "scaleX", 0.5f, 1.0f);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(view, "scaleY", 0.5f, 1.0f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(objectAnimator0, objectAnimator1);
animatorSet.setDuration( 1200);
animatorSet.setInterpolator(new SpringInterpolator(0.3f));
animatorSet.start();
效果如下
1565254632347.gif