ddu- 属性动画

常用方法:

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实例,进行链式调用完成后直接执行动画(隐式调用执行)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写的非常好,强烈推荐给大家 转载请注明出处:http://blog.csdn.net/guolin_blog/ar...
    天天大保建阅读 4,212评论 0 1
  • 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果...
    Ten_Minutes阅读 9,246评论 3 11
  • Animation Animation类是所有动画(scale、alpha、translate、rotate)的基...
    四月一号阅读 5,909评论 0 10
  • 喜剧片只有两种,一种是有周星驰的喜剧片,另一种是没有周星驰的喜剧片。 《美人鱼》虽然周星驰没有参演,却作为导演亲力...
  • 最近除非有事要出门,我的作息时间都跟美国时间同步了,甚至两天并作一天地过(48小时睡一次觉)。然而,即使是有事要出...
    lxt阅读 1,111评论 0 1