android动画封装,Android属性动画封装,快速构建动画
Android實現動畫效果的方式主要有幀動畫、補間動畫、屬性動畫。關于安桌動畫的基礎知識可以查看這篇文章Android屬性動畫完全解析
這里我要講的是如何快速構建出一個動畫效果,如下圖:
如果我們用屬性動畫實現,其中點擊男性頭像后的動畫效果的代碼如下:
// 男生頭像移到上面,水平居中
float centerX = -mPortraitMale.getX()+ (Util.getScreenWidth(this) / 2 - mPortraitMale.getWidth() / 2);
ObjectAnimator portraitMaleTransX = ObjectAnimator.ofFloat(mPortraitMale,
"translationX",0,centerX);
portraitMaleTransX.setDuration(500);
ObjectAnimator portraitMaleTransY = ObjectAnimator.ofFloat(
mPortraitMale, "translationY", 0,
-(mPortraitMale.getY() - mPortraitFemal.getY()));
portraitMaleTransY.setDuration(500);
// 女生頭像移出右邊,并逐漸淡出
ObjectAnimator portraitFemaleTrans = ObjectAnimator.ofFloat(
mPortraitFemal, "translationX", 0, Util.getScreenWidth(this)
- mPortraitFemal.getX());
portraitFemaleTrans.setDuration(500);
ObjectAnimator portraitFemaleAlpha = ObjectAnimator.ofFloat(
mPortraitFemal, "alpha", 1, 0.2f);
portraitFemaleAlpha.setDuration(500);
// 頭像列表的白色背景升起
ObjectAnimator shieldTrans = ObjectAnimator.ofFloat(mPortraitShield,
"translationY", mPortraitShield.getHeight(), 0);
shieldTrans.setDuration(200);
shieldTrans.addListener(new BaseAnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
mPortraitShield.setVisibility(View.VISIBLE);
}
public void onAnimationEnd(Animator animation) {
mScrollView.setVisibility(View.VISIBLE); // 顯示頭像列表
}
});
// 頭像列表從底部升起
ObjectAnimator listTrans = ObjectAnimator.ofFloat(mScrollView,
"translationY", mScrollView.getHeight(), 0);
listTrans.setDuration(500);
AnimatorSet listAnimSet = new AnimatorSet();
listAnimSet.play(shieldTrans).before(listTrans);
AnimatorSet animatorSet = new AnimatorSet();
// 把男生女生頭像移到相應位置后,再彈出頭像列表
animatorSet.play(portraitMaleTransX).with(portraitMaleTransY)
.with(portraitFemaleTrans).with(portraitFemaleAlpha)
.before(listAnimSet);
animatorSet.start();
其實這個效果不難實現,可代碼看上去卻比較凌亂臃腫,所以,我對屬性動畫進行了封裝,封裝后的工具類為AnimatorUtil。使用方法介紹:
1.調用AnimatorSetWrap animSetWrap =?AnimatorUtil.createAnimator(obj); 獲取屬性動畫的封裝對象,obj為動畫起初要操作的對象
2.animSetWrap.play(duration, ?propertyName, values) \\設置第一個要執行的動畫
.with(duration, ?propertyName, values) \\ 該動畫跟play中的動畫同時執行
.with(obj,?duration, ?propertyName, values) \\ obj為要操作的對象,該對象動畫跟play中的動畫同時執行
.then(obj,?duration, ?propertyName, values) \\ play動畫執行完后,執行第一個then中的動畫
.then(obj,?duration, listener,?propertyName, values) \\ 第1個then動畫執行完后,執行第2個then中的動畫,listener為動畫監聽器
.then(obj,?duration, ?propertyName, values) \\ 第2個then動畫執行完后,執行第3個then中的動畫,依次類推,鏈式構建動畫
.start(); \\ 執行動畫
AnimatorSet animSet = animSetWrap.getAnimatorSet(); \\ 獲取被封裝的Animtor對象
3.另外還有before()和after()方法,跟自帶的屬性動畫的方法一樣,before里的動畫在play動畫執行完后執行,after動畫執行完后才執行play動畫,即在play動畫之前執行。AnimatorSetWrap中的每個動畫方法都有多個重載版本,可以傳入操作對象、監聽器等,如上所示,方法直接可以鏈式調用。
AnimatorUtil的核心方法then()的實現在于,用一個數組存儲所有的then動畫,在play()方法內部添加監聽器,當play動畫結束后執行第一個then動畫;then()方法內部對動畫添加了監聽器,當then動畫結束時執行下一個then動畫,依次類推,使動畫按照順序執行。關鍵代碼如下:
public AnimatorSetWrap play(Object obj, long duration,
AnimatorListener listener, String propertyName, float... values) {
ObjectAnimator animator = ObjectAnimator.ofFloat(obj,
propertyName, values).setDuration(duration);
if (listener != null) {
animator.addListener(listener);
}
mAnimatorsThen.clear(); // 清空
// play動畫執行完之后執行第一個then()動畫
animator.addListener(new AnimatorListenerThen(mAnimatorsThen.size()));
mAnimatorSetBuilder = mAnimatorSet.play(animator);
return this;
}
public AnimatorSetWrap then(Object obj, long duration,
AnimatorListener listener, String propertyName, float... values) {
ObjectAnimator animator = ObjectAnimator.ofFloat(obj,
propertyName, values).setDuration(duration);
if (listener != null) {
animator.addListener(listener);
}
mAnimatorsThen.add(animator);
animator.addListener(new AnimatorListenerThen(mAnimatorsThen.size()));
return this;
}
private class AnimatorListenerThen implements AnimatorListener {
private int mNextAnim = -1; // 下一個動畫在mAnimators中的索引
public AnimatorListenerThen(int nextAnimIndex) {
mNextAnim = nextAnimIndex;
}
public void onAnimationEnd(Animator animation) {
// 執行下一個動畫
if (mNextAnim < mAnimatorsThen.size()) {
mAnimatorsThen.get(mNextAnim).start();
}
}
}
下面是使用AnimatorUtil工具類構建上圖動畫的代碼:
float portraitMaleX = -mPortraitMale.getX()
+ (Util.getScreenWidth(this) / 2 - mPortraitMale
.getWidth() / 2);
float portraitMaleY = -(mPortraitMale.getY() - mPortraitFemal
.getY());
AnimatorUtil
.createAnimator(mPortraitMale)
.play(500, "translationX", 0,
portraitMaleX)
.with(500, "translationY", 0,
portraitMaleY)
.with(mPortraitFemal, 500,
"translationX", 0,
Util.getScreenWidth(this) - mPortraitFemal.getX())
.with(mPortraitFemal, 500, "alpha",
1, 0.2f)
.then(mPortraitShield,
200,
new BaseAnimatorListener() {
public void onAnimationStart(
Animator animation) {
mPortraitShield.setVisibility(View.VISIBLE);
}
public void onAnimationEnd(
Animator animation) {
mScrollView.setVisibility(View.VISIBLE);
}
}, "translationY", mPortraitShield.getHeight(),
0)
.then(mScrollView, 500,"translationY", mScrollView.getHeight(), 0)
.start();
可以看出代碼簡潔明了,構建動畫便捷,如果要新增加動畫效果,在相應方法后面加入動畫即可。
總結
以上是生活随笔為你收集整理的android动画封装,Android属性动画封装,快速构建动画的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android播放器自定义,androi
- 下一篇: android 设置键盘弹出动画,And