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

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

主站蜘蛛池模板: 国产原创视频在线观看 | 国产欧美日韩在线视频 | 欧美激情另类 | 免费视频成人 | free性欧美hd另类 | 欧美另类老妇 | 91精品国产综合久久久久久久 | 国产精品一国产精品 | 一级黄色片一级黄色片 | 一本色道综合久久欧美日韩精品 | 好男人在线视频www 亚洲福利国产 | 久久加久久 | 欧美激情69| 91华人在线| 久久精品香蕉 | 日日骚av一区二区 | 一级aaa毛片 | 99爱视频在线观看 | 啊v视频在线 | 人妻无码一区二区三区四区 | 色午夜 | 理论片午午伦夜理片影院99 | 成人免费在线播放 | 美女视频黄色免费 | 无码人妻精品一区二 | 一级黄色短视频 | av伊人久久 | 欧美一级欧美三级在线观看 | 久久久久久久综合 | 四虎网站| 日韩少妇内射免费播放 | 国产欧美日韩精品一区 | 99少妇| 依依成人综合 | 国产私拍视频 | 国产99久久久国产精品免费看 | 伊人影院久久 | 国产在线成人精品午夜 | www.av在线视频 | 国产又粗又猛又爽又黄的视频小说 | 风流老熟女一区二区三区 | 日韩欧美精品一区二区 | 免费看91 | 女人脱下裤子让男人桶 | 色香五月 | 日韩综合一区 | 朝鲜女人性猛交 | 最近最好的2019中文 | 综合xx网| 大尺度做爰呻吟舌吻情头 | 天天操天天干视频 | 免费大片黄在线观看视频网站 | 国产欧美视频一区二区 | 久久av喷吹av高潮av萌白 | 亚洲欧美在线视频免费 | 国产欧美视频在线播放 | 久久精品在线视频 | 性一交一乱一乱一视频 | 黄色中文字幕 | 国产黄站| 国产视频97 | 成年人看的视频网站 | 欧美大色网 | 黄色大片免费观看视频 | 禁断介护av | 久久偷拍免费视频 | 日韩黄色片网站 | 亚洲欧美日韩国产成人精品影院 | 国产乱淫av麻豆国产 | 天堂va蜜桃一区二区三区 | 中文字幕1页 | 青草视频免费在线观看 | 中国zzji女人高潮免费 | 久久久国产精品一区二区三区 | 超碰这里只有精品 | 日本一区二区高清免费 | 十八岁世界在线观看高清免费韩剧 | 中文字幕日韩人妻在线视频 | 精品人人妻人人澡人人爽牛牛 | 奇米四色在线观看 | 女同在线视频 | 丰满熟女人妻一区二区三区 | 久久久久亚洲色欲AV无码网站 | www.国产精品.com | 亚洲免费a| 少妇又白又嫩又色又粗 | 五月婷婷六月婷婷 | 99国内揄拍国内精品人妻免费 | 1769国产 | 捆绑无遮挡打光屁股 | 大香蕉视频一区二区 | 午夜免费福利网站 | 国产免费视屏 | 欧美片在线观看 | av中文字幕观看 | 九草在线 | 免费在线观看一区二区 | 久久精品视频免费播放 | 免费不卡视频 |