android 中 objectanimator 和 Inter

2019-08-08  本文已影响0人  ZSGZ_AD
image.png

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
上一篇下一篇

猜你喜欢

热点阅读