属性动画与补间动画的区别:
最大的区别是补间动画就算控件移动到任何位置,控件本身位置还是不变。
而属性动画是直接改变控件的位置。
从某种角度看,属性动画是增强版的补间动画,其强大体现在两方面:
- 补间(tween)动画只能定义两个关键帧在透明度、旋转、倾斜、位移这4个方面的变化,而属性动画可以定义任何属性的变化。
- 补间动画只能对 UI 组件执行动画,而属性动画几乎可以对任何对象执行动画。
需要的属性:
android:duration : | 动画持续时间。默认值 300 毫秒。 |
android:interpolator : | 动画插值方式。与补间动画中插值属性作用类似。 插值器android:interpolator也要定义在set节点才有效 |
android:repeatCount : | 动画重复次数。repeatCount在AnimationSet中不起作用 |
android:repeatMode : | 重复方式。指定动画结束后,从头重播还是反向播放。 |
<set.../> 元素组合 : | 动画集。可将多个属性动画合并为一组,既可使之依次播放,也可使之同步播放。 |
帧刷新频率。指定每帧播放时间。默认值 10 毫秒。 | 帧刷新频率。指定每帧播放时间。默认值 10 毫秒。 |
属性动画API:
- Animator :提供了创建属性动画的基类,通常用于被继承并重写其相关方法。
- ValueAnimator :属性动画主要的时间引擎,定义了属性动画的大部分核心功能,包括计算各个帧的相关属性值、负责处理更新事件,按属性值的类型控制计算规则。
- ObjectAnimator :是 ValueAnimator 子类,允许程序员对指定对象的属性执行动画。实际应用中因其简单更为常用。
- AnimatorSet :是 Animator 的子类,用于组合多个 Animator,并指定多个 Animator 是依次播放还是同步播放。
使用 ValueAnimator 创建动画
- 调用 ValueAnimator 的 ofInt()、ofFloat() 或 ofObject() 静态方法创建 ValueAnimator 实例。
- 调用 ValueAnimator 的 setXxx() 设置动画持续时间、插值方式、重复次数等。
- 调用 ValueAnimator 的 start() 方法启动动画。
- 为 ValueAnimator 注册 AnimatorUpdateListener 监听器,用以监听 ValueAnimator 计算出来的值的改变(可通过 getAnimatedValue() 方法获取当前帧的值),并将这些值应用到指定对象。
-
使用 ObjectAnimator 创建动画
- ObjectAnimator 可直接将 ValueAnimator 在动画过程中计算出来的值应用到指定对 象的指定属性上,不需要注册监听器。
- 使用 ObjectAnimator 的 ofInt()、ofFloat() 或 ofObject() 静态方法创建 ValueAnimator 实例时需要指定具体的对象及其属性名。
- //参数
//
iView
.setTranslationY(3);
/**
*
参数一:设置动画的对象
条件:一定要保证对象拥有getter setter方法 因为拥有getter setter方法的东西才能说是一个属性
*
参数二:设置属性动作的名称
iView
.set
TranslationY
(3);
*
参数三:
view
的坐标起点
*
参数四:坐标的结束点
*/
ObjectAnimator
ofFloat
= ObjectAnimator.
ofFloat
(
iView
,
"TranslationY"
, 0, 500);
ofFloat.start();
-
- 使用 ObjectAnimator 需注意:
须为该对象对应的属性提供 setter 方法,例如
setAlpha(float value) 方法。
调用 ObjectAnimator 的 ofInt()、ofFloat() 或 ofObject() 工厂方法时 values... 参数只提供了一个结束值。因而该对象应为该属性提供一个 getter 方法以返回一个开始值。
如果动画的对象是 View,为了能显示动画效果,可能还需在 onAnimationUpdate() 事件监听方法中调用 View.invalidate() 方法来刷新屏幕不过 View 定义的 setter 方法(如 setAlpha()、setTranslationX() )都会自动调用 invalidate() 方法来的显示。(比如对 Drawable 对象的 color 属性执行动画)。
监听:addUpdateListener :监听对象属性值变化
监听:addListener :监听动画执行状态
使用属性动画:
- 定义属性动画有如下两种方式:
- 使用 ValueAnimator 或 ObjectAnimator 的静态工厂方法来创建动画。
- 使用资源文件来定义动画。
- 第一步:在res/animator目录下创建文件anim_file.xml
- 第二步,在代码中加载动画文件
Animator
loadAnimator
= AnimatorInflater.
loadAnimator
(
this
, R.animator.
anima_file
);
loadAnimator
.setTarget(
iView
);
loadAnimator
.start();
- 使用属性动画的详细步骤:
- 创建 ValueAnimator 或 ObjectAnimator 对象——从 XML 资源文件加载动画资源或调用两者的静态工厂方法来创建均可。
- 根据需要为 Animator 对象设置属性。
- 如果需要监听 Animator 的动画开始事件、动画结束事件、动画重复事件、动画值改变事件,并提供相关响应处理代码,则应为 Animator 注册事件监听器。
- 如果有多个动画需要依次或同步播放,应使用 AnimatorSet 组合这些动画。
- 调用 Animator 的 start() 方法启动动画。
长宽 同时缩小 到原来一半
public
void
scale(View
cView
) {
// iView.setScaleX(0.1f);
//
定义动画
ObjectAnimator
ofFloat
= ObjectAnimator.
ofFloat
(
iView
,
"ScaleX"
, 1, 0.5f);
//
持续时间
ofFloat
.setDuration(1000);
//
监听变化
但是一定要在
start
方法之前
ofFloat
.addListener(
new
AnimatorListener() {
@Override
public
void
onAnimationStart(Animator
animation
) {
//
动画开始
}
@Override
public
void
onAnimationRepeat(Animator
animation
) {
//
重复
}
@Override
public
void
onAnimationEnd(Animator
animation
) {
//
动画结束
}
@Override
public
void
onAnimationCancel(Animator
animation
) {
//
动画取消
}
});
//ValueAnimator
专用侦听,用来监听属性改变
ofFloat
.addUpdateListener(
new
AnimatorUpdateListener() {
/**
*
当属性值发生改变的时候调用
*/
@Override
public
void
onAnimationUpdate(ValueAnimator
animation
) {
//
获取动画执行的百分比
float
animatedFraction
=
animation
.getAnimatedFraction();
Log.
i
(
"TAG"
,
"-------onAnimationUpdate-----"
+
animatedFraction
);
float
value
= 1-
animatedFraction
*0.5f;
iView
.setScaleY(
value
);
}
});
ofFloat
.start();
}
set用法
//
目的
把左上角图片移动到右下角
//
使用
set
动画
xy
轴都移动
public
void
set(View
cView
) {
//
获取屏幕高度
宽度
DisplayMetrics
displayMetrics
= getResources().getDisplayMetrics();
int
widthPixels
=
displayMetrics
.
widthPixels
;
int
heightPixels
=
displayMetrics
.
heightPixels
;
//
定义
xy
方向的移动
ObjectAnimator
ofFloatX
= ObjectAnimator.
ofFloat
(
iView
,
"TranslationX"
, 0,
widthPixels
-
iView
.getWidth());
// ofFloatX.setInterpolator(new
acc
);
ObjectAnimator
ofFloatY
= ObjectAnimator.
ofFloat
(
iView
,
"TranslationY"
, 0,
heightPixels
-
iView
.getHeight());
//3
定义
AnimatorSet
set
=
new
AnimatorSet();
//4
通过
add
加载
set
.playTogether(
ofFloatX
,
ofFloatY
);
//
设置持续时间
// set.setDuration(4000);
set
.start();
}