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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容