美文网首页
android 中 objectanimator 和 Inter

android 中 objectanimator 和 Inter

作者: ZSGZ_AD | 来源:发表于2019-08-08 17:00 被阅读0次
    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

    相关文章

      网友评论

          本文标题:android 中 objectanimator 和 Inter

          本文链接:https://www.haomeiwen.com/subject/mkpxjctx.html