眾所周知琉朽,AnimatorSet是用來處理view的一系列動畫的集合毒租,允許對控件設(shè)置一系列的動畫。在AnimatorSet里可以指定動畫的播放順序箱叁、是否一起播放或者是否延遲播放墅垮。
向AnimatorSet添加動畫有兩種不同的方法,其一是調(diào)用playTogether()或playSequentially()方法來一次性添加一組動畫,其二是播放(Animator)可以與Builder類一個一個添加動畫耕漱。
注:在添加系列動畫時算色,一定要考慮到同時執(zhí)行的動畫之間是否會出現(xiàn)沖突。比如添加的動畫且同時執(zhí)行的孤个,一個向左移動剃允,另外一個向右移動,此時Android系統(tǒng)必然不知道如何處理齐鲤,這種小失誤應(yīng)該是規(guī)避的斥废。
這里要知道AnimatorSet.Builder這個內(nèi)部類是一個使用的動畫工具類,用于方便向AnimatorSet添加動畫以及設(shè)置各種動畫之間的關(guān)系给郊。在AnimatorSet.Builder中牡肉,共聲明了after(long)、after(Animator)淆九、before(Animator)统锤、with(Animator)等四個方法毛俏。
after(delay):設(shè)置動畫延遲delay時間后播放
after(anim):設(shè)置在anim動畫結(jié)束后播放此動畫
before(anim):設(shè)置此動畫早于anim播放
with(anim):設(shè)置此動畫與anim一起播放
與playTogether()和playSequentially()方法想比較,采用AnimatorSet.Builder向AnimatorSet逐一添加動畫饲窿,更能準確的知道動畫的播放順序煌寇。
示例:
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();
最終的動畫執(zhí)行順序是:
1,bounceAnim
2,squashAnim1與squashAnim2、stretchAnim1逾雄、stretchAnim2一起執(zhí)行
3,bounceBackAnim
4,fadeAnim
還有一些常用的方法:
play(Animator anim):添加一個動畫阀溶,并返回AnimatorSet.Builder
playSequentially(List items):添加一組動畫,播放順序為一步步播放
playSequentially(Animator… items):添加一組動畫鸦泳,播放順序為一步步播放
playTogether(Collection items):添加一組動畫银锻,播放順序為一起播放
playTogether(Animator… items):添加一組動畫,播放順序為一起播放
下面結(jié)合ObjectAnimator類來展示這些方法的執(zhí)行順序做鹰。
ObjectAnimator屬性動畫:直接動畫所給的對象,他會調(diào)用對象對應(yīng)屬性的get/set方法吧屬性的值設(shè)置給對象的屬性击纬,直接實現(xiàn)動畫效果。
ObjectAnimator的初始化也是通過一系列ofXXX()方法來進行钾麸,但是參數(shù)有所變化更振,他的這些方法都要求傳入一個Object對象,然后就會在這個對象上執(zhí)行動畫饭尝。
分析一下ofFloat(Object target, String propertyName, float... values)參數(shù):
參數(shù) | 解釋 |
---|---|
target | 對象殃饿,一般就某個view,指定要改變誰的屬性 芋肠。 |
propertyName | 屬性名,指定要改變對象的什么屬性遵蚜,這個屬性名要求在兌現(xiàn)中必須有對應(yīng)的public的PsetPropertyName的方法帖池。比如下面要講到的rotationX,rotaionY等等吭净。 |
values | 一系列這個屬性將會到達的值睡汹。 |
這是propertyName的一些解釋和效果
ObjectAnimator第二個參數(shù)的屬性 | 對應(yīng)的set方法 | 效果 |
---|---|---|
alpha | public void setAlpha(float alpha) | 改變透明度 |
translationX | setTranslationX | 沿X軸平移 |
translationY | setTranslationY | 沿Y軸平移Y |
scaleX | setScaleX | 沿X軸縮放 |
scaleY | setScaleY | 沿Y軸縮放 |
rotationX | setRotationX | 繞X軸旋轉(zhuǎn) |
rotationY | setRotationY | 繞Y軸旋轉(zhuǎn) |
rotation | setRotation | 繞Z軸旋轉(zhuǎn) |
下面是動畫的實現(xiàn)
/**
* 光效 沿x軸翻轉(zhuǎn)
* @return
*/
public ObjectAnimator buildCoverLightrotationX(){
//0,為初始狀態(tài), -20為角度寂殉,中間變化值囚巴。-50為角度是最終動畫截止角度
return ObjectAnimator.ofFloat(mBoxLight, "rotationX", 0, -20, -50).setDuration(TIME_TRANSLATE_DURATION);
}
/**
* 光效 漸變
* @return
*/
public ObjectAnimator buildCoverLightAlpha(){
return ObjectAnimator.ofFloat(mBoxLight, "alpha", 0.2f, 1, 0).setDuration(TIME_TRANSLATE_DURATION);
}
/**
* 半打開
*
* @return
*/
public ObjectAnimator buildCoverHalfOn() {
final float halfHeight = mBoxcover.getHeight() * 0.4f;
return ObjectAnimator.ofFloat(mBoxcover, "translationY", 0, halfHeight, halfHeight)
.setDuration(TIME_TRANSLATE_DURATION);
}
/**
* 光效 滑到一半
* @return
*/
public ObjectAnimator buildCoverLightHalfOn() {
final float fullHeight = mBoxcover.getHeight() * 0.4f;
return ObjectAnimator.ofFloat(mBoxLight, "translationY", 0, fullHeight, fullHeight)
.setDuration(TIME_TRANSLATE_DURATION);
}
然后是對這些動畫的一并播放
AnimatorSet set = new AnimatorSet();
ObjectAnimator coverAnim = mAnimationControler.buildCoverHalfOn();
ObjectAnimator lightMoveY = lightMoveY = mAnimationControler.buildCoverLightHalfOn();
ObjectAnimator lightMoveX = mAnimationControler.buildCoverLightrotationX();
ObjectAnimator lightAlpha = mAnimationControler.buildCoverLightAlpha();
coverAnim.setDuration(TIME_TRANSLATE_DURATION);
set.playTogether(coverAnim, lightMoveX, lightAlpha, lightMoveY);
最終的效果圖是這樣子的。界面方面的就不講了友扰。
playSequentially方法其實就是動畫一個個播放彤叉,這里由于效果不好看所以就不展示啦,哈哈哈村怪。