属性动画与补间动画的区别:
最大的区别是补间动画就算控件移动到任何位置,控件本身位置还是不变。
而属性动画是直接改变控件的位置。
从某种角度看,属性动画是增强版的补间动画,其强大体现在两方面:
- 补间(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.setTranslationY(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();
}