日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android动画封装,Android属性动画封装,快速构建动画

發布時間:2025/3/20 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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属性动画封装,快速构建动画的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。