Property动画之多属性与关键帧

如果想同时改变多个属性,一般的思路就是组合动画,AnimatorSet来处理,这里还有一种比较先进点的方式:PropertyValuesHolder 可以将多个属性的改变放在一个容器中,可以理解adapter的ViewHolder;

PropertyValuesHolder是API Level 11 加进来的,根据名称可以判断出某种属性的持有者,使用工厂方法构造PropertyValuesHolder对象,指定属性名和属性值;


   //一个动画改变多个属性
                //PropertyValuesHolder holder]
                PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 0, 0.5f*example.getWidth());
                PropertyValuesHolder pvhY=PropertyValuesHolder.ofFloat("y",0,example.getHeight());
                PropertyValuesHolder ppvhAlpha=PropertyValuesHolder.ofFloat("alpha",1,0);
                ObjectAnimator.ofPropertyValuesHolder(example, pvhX,pvhY,ppvhAlpha).setDuration(3000).start();

Property动画之多属性与关键帧_第1张图片


View的多属性动画的另外一种方式:使用ViewPropertyAnimator

ViewPropertyAnimator是API Level 12引入的,他是用来做针对View对象的多个属性动画功能

(前面的PropertyValuesHolder对象是正对所有对象,范围更广

如果要同时变换一个View的多个属性的话,ViewPropertyAnimator提供了一种更方便和更适合的方案,而且由于多个属性的invalidate方法同意管理,而不是之前的分别调用。所以还有一些性能的变化。注意ViewPropertyAnimator这个泪的对象不是油构造的,而是通过View的animate()方法返回的.

源码:

 /**
     * This method returns a ViewPropertyAnimator object, which can be used to animate
     * specific properties on this View.
     *
     * @return ViewPropertyAnimator The ViewPropertyAnimator associated with this View.
     */
    public ViewPropertyAnimator animate() {
        if (mAnimator == null) {
            mAnimator = new ViewPropertyAnimator(this);
        }
        return mAnimator;
    }


调用方式:

    v.animate().x(0.5f*example.getWidth()).y(example.getHeight()).setDuration(3000).start();

同样实现了右下的效果


关键帧KeyFrame:

    PropertyValuesHolder的工厂方法里面,除了整形ofInt(),浮点型ofFloat类型ofObject()之外,还有一种,ofKeyFrame().

    KeyFrame类型对象由一个time/value键值对组成,定义了指定时间点的指定值.

    

   每一个keyFrame还可以拥有自己的interpolator,控制了前一个关键帧到这一个关键帧之间的时间动画行为:

    KeyFrame对象的构造也可以是工厂方法:ofInt(),ofFloat(),ofObject()

   KeyFrame对象构造完成之后就可以用ofKeyFrame()工厂方法来构造PropertyValuesHolder对象

  Keyframe k1=Keyframe.ofFloat(0,0);
                k1.setInterpolator(new LinearInterpolator());
                Keyframe k2=Keyframe.ofFloat(0.5f,400);
                k2.setInterpolator(new BounceInterpolator());
                Keyframe k3=Keyframe.ofFloat(1,800);
                k3.setInterpolator(new BounceInterpolator());
                PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("y", k1, k2, k3);
                ObjectAnimator.ofPropertyValuesHolder(ball,holder).setDuration(3000).start();


Property动画之多属性与关键帧_第2张图片

你可能感兴趣的:(Property动画之多属性与关键帧)