ddu- 属性动画

2016-07-19  本文已影响0人  小董666

常用方法:

ValueAnimator

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);  

组合动画 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

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()); 模拟物理规律。小球挂反弹效果。

属性动画用在View上ViewPropertyAnimator

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

上一篇下一篇

猜你喜欢

热点阅读