美文网首页
ddu- 属性动画

ddu- 属性动画

作者: 小董666 | 来源:发表于2016-07-19 10:06 被阅读0次

    常用方法:

    ValueAnimator

    • 常用方法ValueAnimator.ofInt(1,100),ValueAnimator.ofFloat(0f, 1f); ValueAnimator.ofObject();
      setStartDelay()方法来设置动画延迟播放的时间
      调用setRepeatCount()和setRepeatMode()方法来设置动画循环播放的次数以及循环播放的模式,
      循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思

    • 它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等
      ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);//创建一个ValueAnimator 对象
      anim.setDuration(300);
      anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator animation) {
      float currentValue = (float) animation.getAnimatedValue();

           }
       });
       anim.start();
      
    • 0和1就表示将值从0平滑过渡到1

    • ofFloat()参数是一个不定长,还可以ValueAnimator.ofFloat(0f, 4f, 2f, 10f); 表示一个值在5秒内从0过渡到4,再过渡到2,再过渡到10.

    ObjectAnimator

    它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的。

          ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f);  //透明度变化
          animator.setDuration(5000);
          animator.start();
    

    对对象操作改变属性;

        ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);//旋转
        animator.setDuration(5000);
        animator.start();
    

    移除屏幕在进来:

      float curTranslationX = view.getTranslationX();
      ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX,     -500f, curTranslationX);
      animator.setDuration(5000);
      animator.start();
    

    垂直方向上进行缩放再还原:

     ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);  
    
    • alpha、rotation、translationX和scaleY,分别可以完成淡入淡出、旋转、水平移动、垂直缩放这几种动画。
    • ObjectAnimator 不单对view操作,是任意对象,第二个参数的属性,会调用它的getter,setter:
      public void setAlpha(float value);
      public float getAlpha();

    组合动画 AnimatorSet

    after(Animator anim) 将现有动画插入到传入的动画之后执行
    after(long delay) 将现有动画延迟指定毫秒后执行
    before(Animator anim) 将现有动画插入到传入的动画之前执行
    with(Animator anim) 将现有动画和传入的动画同时执行

      ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
      ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
      ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
      AnimatorSet animSet = new AnimatorSet();
      animSet.play(rotate).with(fadeInOut).after(moveIn);
      animSet.setDuration(5000);
      animSet.start();
    

    监听器:

        anim.addListener(new AnimatorListenerAdapter() {
        @Override
          public void onAnimationEnd(Animator animation) {
            }
        });
    

    默认的监听器要实现所有接口,使用AnimatorListenerAdapter可以只是实现部分接口。

    XML方式

    res目录下面新建一个animator文件夹

    <animator> 对应代码中的ValueAnimator
    <objectAnimator> 对应代码中的ObjectAnimator
    <set> 对应代码中的AnimatorSet

          <animator xmlns:android="http://schemas.android.com/apk/res/android"
            android:valueFrom="0"
            android:valueTo="100"
            android:propertyName="alpha"
            android:valueType="intType"/>
    

    android:propertyName:改变的属性的名字
    android:valueType:值得类型,还有floatType

    • 加载方式
      Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim);

    ValueAnimator的高级用法

    TypeEvaluator:一个接口,提供一个过渡的计算接口,ofFloat()系统内置了一个FloatEvaluator

          public class FloatEvaluator implements TypeEvaluator {
            public Object evaluate(float fraction, Object startValue, Object endValue) {
            float startFloat = ((Number) startValue).floatValue();
              return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
            }
          }
    

    ofObject:

        public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values)
    

    我们就要自定义过渡计算,实现TypeEvaluator 接口。
    比如:Point 原点

    public class PointEvaluator implements TypeEvaluator{

    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {
        Point startPoint = (Point) startValue;
        Point endPoint = (Point) endValue;
        float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
        float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
        Point point = new Point(x, y);
        return point;
        }
    }
    

    fraction:动画的完成度。
    调用: ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);

    ObjectAnimator的高级用法

    ObjectAnimator内部的工作机制是通过寻找特定属性的get和set方法,然后通过方法不断地对值进行改变,从而实现动画效果的。
    对颜色等有,具有getter,setter属性的改变过渡。

    Interpolator:插值器

    anim.setInterpolator(new BounceInterpolator()); 模拟物理规律。小球挂反弹效果。

    • 自定义Interpolator要实现TimeInterpolator 接口。
      public interface TimeInterpolator {
      float getInterpolation(float input);
      }
      这个接口有一个input值,跟上边的完成度有很大关系,input经过计算,改变完成度。系统默认的是匀速,所以默认情况下2者的值相同。

    属性动画用在View上ViewPropertyAnimator

    因为属性动画不是针对的view,而是object,但是它对view提供了很简便的用法:

    • view.animate().alpha(0.5f); //builder模式,链式。

    • view.animate().x(300).y(300).setDuration(200); //组合动画
      view的animate()方法返回一个ViewPropertyAnimator实例,进行链式调用完成后直接执行动画(隐式调用执行)。

    相关文章

      网友评论

          本文标题:ddu- 属性动画

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