属性动画:Animator,AnimatorSet,ObjectAnimator
属性动画可以设定顺序执行一系列的动画操作,在某一时刻也可以同时也就是叠加执行多个动画,相比于Animation类更灵活。
属性值:
1)translationX 和translationY:这两个属性控制了View所处的位置,它们的值是由layout容器设置的,是相对于坐标原点(0,0左上角)的一个偏移量。
2)rotation, rotationX 和 rotationY:控制View绕着轴点(pivotX和pivotY)旋转。
3)scaleX 和 scaleY:控制View基于pivotX和pivotY的缩放。
4)pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点。
5)x 和 y:描述了view在其父容器中的最终位置,是左上角坐标和偏移量(translationX,translationY)的和。
6)aplha:透明度,1是完全不透明,0是完全透明。
简单使用ObjectAnimator
ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f);
ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.playTogether(animX, animY);// playTogether表示异步叠加,还有playSequentially,表示同步执行
animSetXY.start();
ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f);
ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.playTogether(animX, animY);// playTogether表示异步叠加,还有playSequentially,表示同步执行
animSetXY.start();
利用PropertyValuesHolder,属性集合
//PropertyValuesHolder属性holder,分别设置X,Y方向的移动值,然后调用ofPropertyValuesHolder设置属性值,这个是异步叠加动画。
//参数指的是相对于view最初位置的偏移值
PropertyValuesHolder pvhX =PropertyValuesHolder.ofFloat("translationX",原point值减去view的point,现point值减去view的值);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("translationY",同上);
//参数ofFloat,第一个是属性,多参数values这是一组值,就是由什么值变动到另外一个什么值,再到什么什么值
//如下表示绕着垂直于屏幕的Z轴旋转,从0度顺时针旋转到120度。
PropertyValuesHolderPropertyValuesHolder pvhR = PropertyValuesHolder. ofFloat("rotation", 0,120);
关键帧Keyframe,配合PropertyValuesHolder使用
//Keyframe类型对象由一个time/value对组成,定义了指定时间点的指定值。
//其中ofFloat第一个参数是从0f到1f表示整个过程比例,第二个参数表示values
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
Keyframe kf1 = Keyframe.ofFloat(0.5f, 60f);
Keyframe kf2 = Keyframe.ofFloat(1f, 120f);
// 用三个关键帧构造PropertyValuesHolder对象,最后装配到ObjectAnimator,再用Animatorset来play,start。
PropertyValuesHolder pvhX = PropertyValuesHolder.ofKeyframe(
"x", kf0, kf1, kf2);
animator= ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY,pvhR).setDuration(1000);
ViewPropertyAnimator新方法
myView.animate().x(50f).y(100f);
AnimatorSet
有两种执行动画方式:同步顺序,异步叠加
分别对应playtogether,playSequentially。
Playtogether重载成两种:多参数也就是多个动画Animator;
Collection集合类,集合类中包括了多个动画。
playSequentially重载成两种:多参数也就是多个动画Animator;
List列表类,列表类中包括了多个动画,这样就是可以顺序执行。
利用ofPropertyValuesHolder可以添加异步动画,然后再添加到Animatorlist列表里形成同步动画组。这样就可以兼顾同步和异步的形式,是动画扩展性很强。
animator2=ObjectAnimator.ofPropertyValuesHolder(view, pvhY,pvhR).setDuration(1000);
animator=ObjectAnimator.ofPropertyValuesHolder(view, pvhW).setDuration(1000);
lt.add(animator2);
lt.add(animator);
set.playSequentially(lt);//这样的话pvhY和pyhR就是同时进行pvhW就是顺序执行。
animator2=ObjectAnimator.ofPropertyValuesHolder(view, pvhY,pvhR).setDuration(1000);
animator=ObjectAnimator.ofPropertyValuesHolder(view, pvhW).setDuration(1000);
lt.add(animator2);
lt.add(animator);
set.playSequentially(lt);//这样的话pvhY和pyhR就是同时进行pvhW就是顺序执行。
AnimatorListener
动画和动画集合都可以添加监听器,分别处理动画开始,结束,暂停,重播的事件。
而且AnimatorSet 的监听器开始事件是在所有动画开始之前执行,结束事件是在所有动画结束后再执行。
set.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//所有手势不可用
mUiSettings.setAllGesturesEnabled(false);
Log.i(TAG, "set_____________start");
}
@Override
public void onAnimationEnd(Animator animation) {
mMapView.removeViewInLayout(iv);
//所有手势可用
mUiSettings.setAllGesturesEnabled(true);
Log.i(TAG, "set_____________end");
}
@Override
public void onAnimationCancel(Animator animation) {}
@Override
public void onAnimationRepeat(Animator animation) { }
});