new Handler().postDelayed(new
Runnable() { @Overridepublic void
run() { ObjectAnimator translationY =
ObjectAnimator.ofFloat(btnSplshSkip,"ScaleX",0f,1f).setDuration(1000);ObjectAnimator
translationX =
ObjectAnimator.ofFloat(btnSplshSkip,"ScaleY",0f,1f).setDuration(500);AnimatorSet
set = new
AnimatorSet();set.setInterpolator(new
AccelerateDecelerateInterpolator());
//插补器set.setTarget(btnSplshSkip);
//动画目标set.playTogether(translationY,translationX);
//一起执行set.start();}},200);
ObjectAnimator是属性动画的一个常用类,下面就讲讲它的常用用法最常用属性:
alpha
透明度
rotation
z轴旋转
rotationX
x轴旋转
rotationY
y轴旋转
translationX
x水平偏移
translationY
y水平偏移
ScaleX
x轴缩放
ScaleY
y轴缩放
代码使用:
方法:
ObjectAnimator.ofFloat(target,propertyName,values...);
target
是动画目标
propertyName 是属性名字
values
是可变长度的值
从value1变化到v2到vn。。。
例子:
mIv是一个imageView
//alpha 从0 到1 的动画
ObjectAnimator.ofFloat(mIv, "alpha",
0f,1f)
.setDuration(500)
.start();
如果要实现其他效果,修改propertyName和values就行了。
那么如果要同时执行两个动画呢?
ObjectAnimator.ofFloat(mIv,"translationX",0f,360f) .setDuration(500)
.start();
ObjectAnimator.ofFloat(mIv,"translationY",0f,360f) .setDuration(500)
.start();
这么写会先后顺序执行?还是一起执行?还是?
file:///D:/有道笔记本地文件/nikiy_czn@163.com/776b66c26b74437996e85192bf45a939/scale.gif
效果是一起执行的,说明这动画是异步的
要一起执行动画,我们肯定首先会想到AnimationSet,android的属性动画也有Set类,叫做AnimatorSet
可以方便我们执行一系列动画:
先定义3个animator
ObjectAnimator alpha =
ObjectAnimator.ofFloat(mIv,"alpha",0f,1f).setDuration(300);
ObjectAnimator translationY =
ObjectAnimator.ofFloat(mIv,"translationY",0f,300f).setDuration(500);
ObjectAnimator translationX =
ObjectAnimator.ofFloat(mIv,"translationX",0f,300f).setDuration(500);
AnimatorSet set = new
AnimatorSet();
set.setDuration(500);
//动画执行时间
set.setStartDelay(500);
//执行动画之前的延迟
set.setInterpolator(new
AccelerateDecelerateInterpolator()); //插补器
set.setTarget(mIv);
//动画目标
set.playTogether(alpha,translationY,translationX);
//一起执行
set.start();
这里需要注意的是:
如上代码可以看到,AnimatorSet提供给我们更加强的控制能力,动画的一些设置最终都由AnimationSet决定。
什么意思呢?
比如说我们在alpha指定动画时间为300毫秒,其他两个指定为500毫秒,但是如果通过AnimatorSet.setDuration()来设置了时间的话,那么最终动画的时间就由AnimatorSet的设置决定。
另外我们也可以在之前的Animator指定不同的target,来分别对不同的view进行动画,但是跟上面所说的不同
,如果AnimatorSet.setTarget()指定了动画的目标的话,最终动画的目标还是由之前定义的Animator自己决定。
另外Set还能控制播放动画的顺序,我们之前的代码用的是playTogether
,顾名思义,就是一起执行,
Set还提供另外的方法顺序执行:
playSequentially
来按顺序执行动画:
set.playSequentially(translationX,alpha,translationY); 这样就会先后执行x
alpha y的动画。
one more
thing,AnimationSet还有
before
在xx之前
after
在。。。之后
with
和。。。一起
方法来安排顺序,顾名思义,自己尝试吧~
set.play(translationX).before(translationY).after(alpha);//先执行alpha,再x,再y
如果要一起执行动画,android还有一个PropertyValuesHolder
:
跟ObjectAnimator差不多
但是不需要设置target、duration
PropertyValuesHolder.ofxx(propertyName,values);
PropertyValuesHolder p1 =
PropertyValuesHolder.ofFloat("translationX",
0f,300f);
PropertyValuesHolder p2 =
PropertyValuesHolder.ofFloat("translationY",
0f,300f);
PropertyValuesHolder p3 =
PropertyValuesHolder.ofFloat("alpha",
0f,1f);
PropertyValuesHolder p4 =
PropertyValuesHolder.ofFloat("rotation",
0f,360f);
ObjectAnimator.ofPropertyValuesHolder
(mIv, p1,p2,p3,p4).setDuration(1000).start();
效果图:
file:///D:/有道笔记本地文件/nikiy_czn@163.com/0535d5f7be344f6bb9ae0c5126c27ebb/基本的propertyanim.gif
file:///D:/有道笔记本地文件/nikiy_czn@163.com/dd96c2e50aff4f6facad0e2180279ad4/scale.gif