android属性动画详解一

声明:下载源码,根据我的步骤一步一步来。

依据继承关系,我们先介绍ValueAnimator。

看简单的代码,在从上一点一点加代码。

ValueAnimator value1 = ValueAnimator.ofFloat(0, 195, 0);   //设置变化范围
        value1.setDuration(3000);   //设置动画时间
        value1.start();     // 开启动画
        value1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {       //从时间轴上获得变化值
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                imageView.setRotationX((Float) animation.getAnimatedValue());   //设置图片的透明度,需api11以上
            }
        });
ofFloat(float... values),可传多个参数,动画的更新值从第一个参数值变化到第二个参数值,第二个变化到第三个,以此类推。

你只需在onAnimationUpdate()方法中设置某个对象的属性,animation.getAnimatedValue()得到的是时间轴上变化范围中的值。对于android中的控件和自定义view,你的设置属性方法中要调用重绘方法,或者在onAnimationUpdate()方法中手动调用view的postInvalidate()方法使其重绘。

该代码是简单的x轴旋转动画。



接下来加变化率,也就是设置Interpolator,看代码:

ValueAnimator value1 = ValueAnimator.ofFloat(0, 180);   //设置变化范围
        value1.setDuration(15000);   //设置动画时间
        value1.setInterpolator(new OvershootInterpolator());    //设置变化速率
        value1.start();     // 开启动画
        value1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {       //从时间轴上获得变化值
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                imageView.setRotationX((Float) animation.getAnimatedValue());   //设置图片的透明度,需api11以上
            }
        });

 value1.setInterpolator(new OvershootInterpolator());也就是多了这一句。 OvershootInterpolator    向前甩一定值后再回到原来位置。效果如下:


关于Interpolator的一些知识:

AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速

  AccelerateInterpolator  在动画开始的地方速率改变比较慢,然后开始加速

  AnticipateInterpolator 开始的时候向后然后向前甩

  AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值

  BounceInterpolator   动画结束的时候弹起

  CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线

  DecelerateInterpolator 在动画开始的地方快然后慢

  LinearInterpolator   以常量速率改变

  OvershootInterpolator    向前甩一定值后再回到原来位置

3.设置求值规则

调用setEvaluator()方法,里面可传FloatEvaluator,IntEvaluator等,或者自定义TypeEvaluator,看代码:

value1.setEvaluator(new TypeEvaluator() {   //求值器
            @Override
            public Object evaluate(float fraction, Object startValue, Object endValue) {    //求值方法,依据自定义的求值规则来返回值
                Log.e("fraction+startValue+endValue",fraction+"=="+startValue+"=="+endValue);
                return 1;
            }
        });

第一个参数是在动画执行的时间点上依据变化率得到的分数,以这个分数来生成一个值,返回的这个值可以被AnimatorUpdateListener监听到,这也就有了我们监听器里面依据更新值来做一些操作。上面的返回个固定的值1,所以没有动画过程。


4.自定义TypeEvaluator,ValueAnimator.ofObject用法

还是先上代码:
ValueAnimator value1 = new ValueAnimator();   //设置变化范围
        value1.setObjectValues(new PointF(0,0));
        value1.setDuration(3000);   //设置动画时间
        value1.setEvaluator(new TypeEvaluator() {   //求值器
            @Override
            public PointF evaluate(float fraction, Object startValue, Object endValue) {    //求值方法,依据自定义的求值规则来返回值
                Log.e("fraction+startValue+endValue",fraction+"=="+startValue+"=="+endValue);
                float x = 0 + fraction*(150 - 0);
                float y = 0 + fraction*(300 - 0);
                return new PointF(x,y);
            }
        });
        value1.setInterpolator(new OvershootInterpolator());    //设置变化速率
        value1.start();     // 开启动画
        value1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {       //从时间轴上获得变化值
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                PointF pf = (PointF) animation.getAnimatedValue();  //得到求值器中返回的值
                imageView.setTranslationX(pf.x);
                imageView.setTranslationY(pf.y);
            }
        });
效果:

你可以setObjectValues(多个值),在evaluate(float fraction, Object startValue, Object endValue)就可以得到startValue和endValue,看代码:

ValueAnimator value1 = new ValueAnimator();   //设置变化范围
        value1.setObjectValues(new PointF(0,0),new PointF(150,300));
        value1.setDuration(3000);   //设置动画时间
        value1.setEvaluator(new TypeEvaluator<PointF>() {   //求值器
            @Override
            public PointF evaluate(float fraction, PointF startValue, PointF endValue) {    //求值方法,依据自定义的求值规则来返回值
                Log.e("fraction+startValue+endValue",fraction+"=="+startValue+"=="+endValue);

                float x = startValue.x + fraction*(endValue.x - startValue.x);
                float y = startValue.y + fraction*(endValue.y - startValue.y);
                return new PointF(x,y);
            }
        });
效果跟上面一样,对于对象都这么使用。

对于ValueAnimator其他的一些用法:

ValueAnimator.ofFloat(0, 180)等同于new ValueAnimator().setFloatValues(0,180)。
ValueAnimator.ofPropertyValuesHolder(PropertyValuesHolder.ofFloat("alpha",0,0.3f,0,1)),PropertyValuesHolder主要用在ObjectAnimator中,在这里可以用,但alpha仅仅只是一个标识,可以随便填。


源码http://yunpan.cn/cwebQmG9jhNPh (提取码:9408)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值