属性动画Android动画,Android动画(三)属性动画Animator与Interpolator

概述

继上一篇,Android中的视图动画和帧动画可以实现大部分的Android中的动画需求,但是有一个缺点,就是其事件响应区域并没有发生变化,这时候出现了属性动画完全弥补了这个缺点

属性动画结构

0818b9ca8b590ca3270a3433284dd417.png

可以看到Animator中主要包括AnimatorSet(动画集合),ValueAnimator,ObjectAnimator,

关于属性动画相关api,可以查看这里android.animation,

监听器类

Animator.AnimatorListener

Animator.AnimatorPauseListener,

ValueAnimator.AnimatorUpdateListener

AnimatorListenerAdapter

计算器类

IntEvaluator

FloatEvaluator

ArgbEvaluator

生成相关类

AnimatorInflater

AnimatorSet.Builder

PropertyValuesHolder

ObjectAnimator

ObjectAnimator 不像ValueAnimator 那样需要用户自己来更新属性,会自动跟新,ObjectAnimator 同样可以在xml和代码中设置

xml 设置,需要放在animator目录下

android:duration="3000"

android:propertyName="width"

android:valueFrom="100"

android:valueTo="20"

android:valueType="intType" />

ObjectAnimator objectAnimator =

(ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.object_animator);

objectAnimator.setTarget(wrapper);

objectAnimator.start();

代码设置

ObjectAnimator animator = ObjectAnimator.ofFloat(_view, "translationX", 300);

animator.setDuration(1000);

animator.start();

ObjectAnimator 提供了ofInt、ofFloat、ofObject.其中可以设置的属性必须提供set/get方法,如果没有,可以通过包装类实现,如下实例

public class ViewWrapper {

private View target; //目标对象

private int maxWidth; //最长宽度值

public ViewWrapper(View target, int maxWidth) {

this.target = target;

this.maxWidth = maxWidth;

}

public int getWidth() {

return target.getLayoutParams().width;

}

public void setWidth(int widthValue) {

//widthValue的值从100到20变化

target.getLayoutParams().width = maxWidth * widthValue / 100;

target.requestLayout();

}

}

ValueAnimator

ValueAnimator类可以为一些动画指定一系列的int,float,color值。通过调用工厂方法ofInt(),ofFloat().ofObject()来获取一个ValueAnimator.但是ValueAnimator需要在监听器中获取属性值,更新相关属性

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);

fadeAnim.setDuration(250);

fadeAnim.addListener(new AnimatorUpdateListener() {

//...这里也可以用AnimatorListenerAdapter,而不用实现每个回调方法

}

PropertyValuesHolder

同时在属性动画中提供了一个快捷方式来创建动画,就是PropertyValuesHolder

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,

0f, 1f);

PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,

0, 1f);

PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,

0, 1f);

ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY,pvhZ).setDuration(1000).start();

TimeAnimator

它没有duration、interpolation以及设置值的方法,提供了一个简单的回调机制,通过 TimeAnimator.TimeListener,在动画的每一帧处通知你

//animation:发出通知的动画

//totalTime:动画开始以来的总时间,以毫秒为单位

//deltaTime:从前一帧到现在的运行时间,以毫秒为单位

onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime)

Interpolators

Interpolator class

Resource ID

Description

AccelerateDecelerateInterpolator

@android:anim/accelerate_decelerate_interpolator

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

AccelerateInterpolator

@android:anim/accelerate_interpolator

在动画开始时速率改变比较慢,然后开始加速

AnticipateInterpolator

@android:anim/anticipate_interpolator

动画开始的时候向后然后往前抛

AnticipateOvershootInterpolator

@android:anim/anticipate_overshoot_interpolator

动画开始的时候向后然后向前抛,会抛超过目标值后再返回到最后的值

BounceInterpolator

@android:anim/bounce_interpolator

动画结束的时候会弹跳

CycleInterpolator

@android:anim/bounce_interpolator

动画循环做周期运动,速率改变沿着正弦曲线

DecelerateInterpolator

@android:anim/decelerate_interpolator

在动画开始时速率改变比较快,然后开始减速

LinearInterpolator

@android:anim/decelerate_interpolator

动画匀速播放

OvershootInterpolator

@android:anim/overshoot_interpolator

动画向前抛,会抛超过最后值,然后再返回

自定义Interpolator

一: 继承Interpolator或其子类

private class DeceAcceInterpolator implements Interpolator{

@Override public float getInterpolation(float input) {

return ((4*input-2)*(4*input-2)*(4*input-2))/16f + 0.5f;

}

}

二: 自定义xml,更改属性

其中可设置属性包括

Interpolator class

Attribute Name

accelerateInterpolator

android:factor(浮点值,加速的速率,默认为1)

anticipateInterpolator

android:tension(浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了)

anticipateOvershootInterpolator

android:tension(同上),android:extraTension(浮点值,拉力的倍数,默认为1.5,当设为0时,则不会有向后的动画了)

cycleInterpolator

android:cycles (整数值,循环的次数,默认为1)

decelerateInterpolator

android:factor(浮点值,减速的速率,默认为1)

overshootInterpolator

android:tension(浮点值,超出终点后的拉力,默认为2)

示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值