日韩性视频-久久久蜜桃-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属性动画封装,快速构建动画的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲二区在线播放视频 | 亚洲最新在线视频 | 人人妻人人澡人人爽欧美一区 | 午夜久草| 国产丝袜自拍 | 欧美不在线| 欧美色久 | 日本黄色高清视频 | 日日草视频 | 中国在线观看片免费 | 国产精品美女毛片真酒店 | 久草福利| 国产专区一 | 中文字幕在线观看第一页 | av中文在线观看 | 成在线人免费视频 | 9久9久9久女女女九九九一九 | 人人看人人模 | 国产熟女高潮一区二区三区 | 久久久久国产一区 | 99热8| 黄色大片免费在线观看 | 色久在线 | 老司机免费在线视频 | 国产乱色精品成人免费视频 | 欧美大片aaa | 久久97人妻无码一区二区三区 | 国产精品久久久久久久久免费 | 国产精品一区久久久 | 少妇做爰免费理伦电影 | 久色网 | 玩偶姐姐在线观看免费 | 最新毛片网 | 亚洲黄色短视频 | 亚洲午夜久久久久久久久久久 | 国产特级aaaaaa大片 | 国产精品ⅴa有声小说 | 欧美伦乱 | 亚洲天堂av一区二区 | 欧美美女色图 | 成人1区2区 | 美女免费av| 日韩 欧美 国产 综合 | 午夜快播| 亚洲激情在线观看视频 | 成人影音在线 | 中文字幕一区二区在线观看视频 | 亚洲va天堂va欧美ⅴa在线 | 大吊一区二区三区 | 视频在线| 一区二区三区视频网 | 97超碰资源总站 | 日本美女性高潮 | 日韩欧美亚洲国产精品字幕久久久 | 青春草视频在线免费观看 | 青青草社区视频 | 深夜福利网址 | 永久免费国产 | 色乱码一区二区三区 | 亚洲综合无码一区二区 | 尤物影院在线观看 | 51成人做爰www免费看网站 | 欧美亚洲一区 | 一级片黄色的 | 主播av在线 | 丰满少妇麻豆av苏语棠 | 好看的av在线 | 日韩欧美视频在线免费观看 | 亚洲第一成年人网站 | 91亚洲一线产区二线产区 | 综合久久av| 日韩黄色免费看 | 美女福利视频 | 污视频网站免费看 | 五月婷婷激情在线 | 精品亚洲成人 | 偷偷操不一样 | 日本a视频 | 亚洲区欧美区 | 葵司有码中文字幕二三区 | 五月天婷婷综合 | 日本一级黄色大片 | 日本三级黄色大片 | 美女xx00| 亚洲色图50p | 国产精品一区二区免费在线观看 | 精品视频不卡 | 综合久久中文字幕 | 中文字幕在线观看三区 | 婷婷激情图片 | 国产精品亚洲无码 | 国产精品一区二区三区在线看 | 韩国性猛交╳xxx乱大交 | 国产又爽又黄无码无遮挡在线观看 | 国产视频网 | 国产高清视频免费观看 | 久久怡红院 | 中文字幕一区二区久久人妻 | 国产尤物在线观看 |