亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android可自定義神奇動效的卡片切換視圖實例

2019-10-21 21:25:32
字體:
供稿:網(wǎng)友

前言

面對眾多卡片層疊效果,我們的產(chǎn)品童鞋也突發(fā)奇想,搞出了另一種卡片層疊切換展示的交互,而且產(chǎn)品狗們居然要求多做幾種動效給他們看,好讓他們選擇,這簡直就是要搞事情啊,what are you 弄啥咧?!

“哥哥我做不到啊.....啊.....呸”,做為一名有節(jié)操的程序猿,自然是不能說出這么沒有出息的話,哥就滿足你們,于是,出了個可自定義動效的卡片切換視圖,效果如下所示

Android,動效,卡片切換視圖

思路

首先,要展示出卡片層疊的視覺效果。在這里,我們通過方塊的縮放大小差異以及在Y方向上的位置差異,來展現(xiàn)這種視覺效果。

其次,要能夠方便的定義卡片視圖內(nèi)容。我們通過都很熟悉的設(shè)置Adapter的方式來構(gòu)建內(nèi)容視圖。

最后,要能夠自定義動效。我們通過定義一個由0到1的ValueAnimator,即每個動畫的過程,其實就是該ValueAnimator在一個動畫周期內(nèi),從0變化到1的過程,0表示動畫剛開始,1表示動畫結(jié)束了,0.5則表示這一輪動畫已經(jīng)執(zhí)行到了一半。這樣,通過轉(zhuǎn)換器以及插值器,我們就可以根據(jù)ValueAnimator實時的值,來設(shè)置當(dāng)前正在執(zhí)行動畫的卡片應(yīng)該有的“樣子”。

總覽

我們給出三種基本的動畫模式

/* * ANIM_TYPE_FRONT:被選中的卡片通過自定義動效移至第一,其他的卡片通過通用動效補(bǔ)位 * ANIM_TYPE_SWITCH:選中的卡片和第一張卡片互換位置,并都是自定義動效 * ANIM_TYPE_FRONT_TO_LAST:第一張圖片通過自定義動效移至最后,其他卡片通過通用動效補(bǔ)位 */public static final int ANIM_TYPE_FRONT = 0, ANIM_TYPE_SWITCH = 1, ANIM_TYPE_FRONT_TO_LAST = 2;

并通過Helper類來處理所有的動畫邏輯,以及Adapter來生成卡片視圖

private CardAnimationHelper mAnimationHelper;private BaseAdapter mAdapter;

在onMeasure時根據(jù)卡片寬高比來設(shè)置卡片的尺寸,在此請注意,當(dāng)前情況下卡片寬度與整體容器寬度一致,后續(xù)通過自定義的方式,通過縮放來產(chǎn)生卡片的視覺效果。

private float mCardRatio = CARD_SIZE_RATIO;//寬高比:卡片高 / 卡片寬private int mCardWidth, mCardHeight;//卡片寬高@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  ...  if (mCardWidth == 0 || mCardHeight == 0) {    setCardSize(true);  }}/* * 根據(jù)卡片比例計算卡片寬高,并傳入Helper */private void setCardSize(boolean resetAdapter) {  mCardWidth = getMeasuredWidth();  mCardHeight = (int) (mCardWidth * mCardRatio);  mAnimationHelper.setCardSize(mCardWidth, mCardHeight);  mAnimationHelper.initAdapterView(mAdapter, resetAdapter);}

那么如此之后,自然Helper中就保存了視圖的主要數(shù)據(jù)與參數(shù)

//卡片列表private LinkedList<CardItem> mCards;//當(dāng)前正在向后以及向前移動的卡片private CardItem mCardToBack, mCardToFront;//正在向后以及向前移動卡片的位置private int mPositionToBack = 0, mPositionToFront = 0;//動畫運行的ValueAnimatorprivate ValueAnimator mValueAnimator;//當(dāng)前的動畫系數(shù)private float mCurrentFraction = 1;...//以及一系列的轉(zhuǎn)換器與插值器

細(xì)節(jié)

那么,動畫到底是如何實現(xiàn)的,以及如何自定義的呢,我們以通用動畫為例,來看看動畫的主要流程

首先,在ValueAnimator更新的時候,獲得當(dāng)前的動畫系數(shù),依次來執(zhí)行動畫

/** * ValueAnimator動畫更新 */@Overridepublic void onAnimationUpdate(ValueAnimator animation) {  //獲取當(dāng)前動畫系數(shù)  mCurrentFraction = (float) animation.getAnimatedValue();  //通過插值器獲取插值系數(shù)  fractionInterpolated = mAnimInterpolator.getInterpolation(mCurrentFraction);  doAnimationCommon(mCurrentFraction, fractionInterpolated);  ...}

接著,對需要執(zhí)行動畫的卡片,執(zhí)行動畫,以ANIM_TYPE_FRONT動畫模式為例,當(dāng)選中的卡片移動到最前的時候,原來在這張卡片之前的所有卡片,都要向后移動一位,來留出第一個的位置

/** * 執(zhí)行通用動畫 */private void doAnimationCommon(float fraction, float fractionInterpolated) {  //如果當(dāng)前動畫模式為選中的卡片移到最前  if (mAnimType == InfiniteCardView.ANIM_TYPE_FRONT) {    //則遍歷在選中卡片之前的卡片    for (int i = 0; i < mPositionToFront; i++) {      CardItem card = mCards.get(i);      //對卡片執(zhí)行動畫,從當(dāng)前位置移動到后一個位置      doAnimationCommonView(card.view, fraction, fractionInterpolated, i, i + 1);      ...    }  }...}

最后,通過轉(zhuǎn)換器,對卡片進(jìn)行自定義動畫處理

/** * 對視圖執(zhí)行通用動畫 * @param view         卡片視圖 * @param fromPosition     從該位置 * @param toPosition      移動到該位置 */private void doAnimationCommonView(View view, float fraction, float fractionInterpolated, int    fromPosition, int toPosition) {  //通用轉(zhuǎn)換器轉(zhuǎn)換動畫  mTransformerCommon.transformAnimation(view, fraction, mCardWidth,      mCardHeight, fromPosition, toPosition);  if (mAnimInterpolator != null) {    //通用轉(zhuǎn)換器轉(zhuǎn)換插值動畫    mTransformerCommon.transformInterpolatedAnimation(view, fractionInterpolated,            mCardWidth,mCardHeight, fromPosition, toPosition);  }}

而轉(zhuǎn)換器的具體實現(xiàn)則以DefaultCommonTransformer為例

@Overridepublic void transformAnimation(View view, float fraction, int cardWidth, int cardHeight, int fromPosition, int toPosition) {  //需要跨越的卡片數(shù)量  int positionCount = fromPosition - toPosition;  //以0.8做為第一張的縮放尺寸,每向后一張縮小0.1  //(0.8f - 0.1f * fromPosition) = 當(dāng)前位置的縮放尺寸  //(0.1f * fraction * positionCount) = 移動過程中需要改變的縮放尺寸  float scale = (0.8f - 0.1f * fromPosition) + (0.1f * fraction * positionCount);  ViewHelper.setScaleX(view, scale);  ViewHelper.setScaleY(view, scale);  //在Y方向的偏移量,每向后一張,向上偏移卡片寬度的0.02  //-cardHeight * (0.8f - scale) * 0.5f 對卡片做整體居中處理  ViewHelper.setTranslationY(view, -cardHeight * (0.8f - scale) * 0.5f - cardWidth * (0.02f *     fromPosition - 0.02f * fraction * positionCount));}

對于向第一位移動的選中卡片,也是同理,只不過是根據(jù)該卡片對應(yīng)的轉(zhuǎn)換器來進(jìn)行自定義動畫的轉(zhuǎn)換。

最后的效果,就像演示圖中第一次點擊,圖片向前翻轉(zhuǎn)到第一位的效果一樣。

對于產(chǎn)品狗突如其來的想法,咱們程序猿不善于口水仗的,就只能用代碼來讓他們來服氣了。畢竟,大家還都是伐木累嘛,哈哈。

當(dāng)實現(xiàn)某個東西遇到困難時,不妨想想Android系統(tǒng)自身的一些實現(xiàn)方式,比如參考ListView的Adapter,ViewPager定義翻頁動畫的Transformer等等,總會有意想不到的啟發(fā)。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
成人av网址在线观看| 欧美日韩国产精品一区二区亚洲| 蜜桃一区二区三区在线| 99热都是精品| 欧美激情亚洲综合一区| 久久免费精品国产| 日韩脚交footjobhd| 欧美网站在线| 久久久97精品| 日韩精品免费在线视频| 国产一区二区三区在线观看精品| 欧美一区二区免费在线观看| 污网站免费看| 九九九国产视频| 四虎影视国产在线视频| 亚洲欧洲日韩综合二区| 欧美性极品少妇精品网站| 国产内射老熟女aaaa| 97高清视频| 992tv在线观看在线播放| 精品电影一区二区| 国产乱视频在线观看播放| 麻豆91在线播放免费| 色资源网在线观看| 一本色道久久88亚洲精品综合| 亚洲午夜激情网页| 婷婷综合电影| 欧美日韩视频免费看| 久久精品国产99久久6| 久久久久久美女精品| 网曝门事件国产精品二区| 国产8mav视频| 自拍视频第一页| 黑森林精品导航| 欧美一区二区三区在线播放| f2c人成在线观看免费视频| 国产片一区二区| 日韩高清av在线| 中文字幕亚洲精品| 麻豆md0077饥渴少妇| 精品一卡二卡三卡四卡日本乱码| 开心婷婷激情五月| 精品国产欧美日韩| 禁断一区二区三区在线| 日本二区在线观看| 国外成人在线直播| 日韩精品免费一区二区三区竹菊| 暖暖视频在线免费观看| 成人性生交大片免费看视频r| 伊人精品在线视频| 亚洲电影成人成人影院| 欧美videofree性高清杂交| 草草影院第一页| 久久电影国产免费久久电影| 尤物99国产成人精品视频| 亚洲欧美视频一区二区三区| 视频欧美一区| www国产成人免费观看视频 深夜成人网| 国产精品一区二区美女视频免费看| 欧美裸体视频| 国产精品成人国产乱一区| 日韩三级视频在线观看| 亚洲成人手机在线观看| 97视频网站| 91av免费观看91av精品在线| 精品国产91九色蝌蚪| 国产精品v欧美精品v日本精品动漫| 欧美精品a∨在线观看不卡| 91精品国产高清久久久久久91| 91激情视频在线观看| 精品久久久香蕉免费精品视频| 欧美肥老妇视频| 杨幂毛片午夜性生毛片| 国产一级片网址| 2020国产成人综合网| 久久99精品久久久久久| 中文字幕最新精品| 欧美性生交xxxxxdddd| 粉嫩av一区二区三区四区五区| 国产成人免费视频一区| 亚洲国产精品av| 欧美日韩黄网站| 四虎永久免费| 欧美日韩中文字幕在线视频| 国产成人高清激情视频在线观看| 中文字幕亚洲精品| 夜夜躁狠狠躁日日躁婷婷小说| xxx成人少妇69| 久久久一二三四| 久久久久久亚洲精品美女| 四虎影视永久免费在线观看一区二区三区| 日韩中文字幕免费视频| 黄色三级在线观看| 乱人伦精品视频在线观看| 一区二区三区中文字幕| 最近中文在线观看| 成人欧美日韩| 九热视频在线观看| 99精品偷自拍| 国色天香一二三期区别大象| 五月天男人天堂| 亚洲伊人影院| 中文字幕 自拍偷拍| 被男同事摸的水好多| av亚洲精华国产精华精华| 国产黄色av片| 国产精品无码久久久久成人app| 免费在线观看污网站| 91福利入口| 亚洲乱码国产乱码精品精的特点| 成人性生交大片免费观看网站| 精品久久久久久久免费人妻| 免费又黄又爽又色的视频| 人人在草线视频在线观看| 91精品国产91久久久久久最新毛片| 日本夜夜草视频网站| 欧美日韩国产黄| 成人爽a毛片| 伊人精品久久久久7777| 实拍女处破www免费看| 国产成人精品久久亚洲高清不卡| 日韩精品视频免费看| 青青草华人在线视频| 国产少妇在线观看| 亚洲视频在线观看日本a| 国产免费观看av| 日本在线精品| 亚洲卡通动漫在线| 91免费在线视频| 国产精品视频在线免费观看| 狼狼综合久久久久综合网| 欧美福利一区二区| 夜夜爽av福利精品导航| 欧美色图在线视频| 久久精品日产第一区二区三区| 欧美激情综合| 日本一级片在线播放| 国产欧美综合在线| 久久午夜精品视频| 手机在线观看av| 日韩亚洲国产中文字幕欧美| 亚洲最大在线视频| 色视频免费在线观看| 亚洲理伦在线| 试看120秒一区二区三区| 日韩欧美激情一区二区| 欧美多人爱爱视频网站| 美女一区二区三区在线观看| 国产伦理久久久久久妇女| 欧美日韩一级大片| 中文字幕不卡在线| 999在线观看精品免费不卡网站| 天天操夜夜操夜夜操| 97在线免费观看视频| 国产精品久久久久久亚洲调教| 日韩一区二区三区在线播放| 天天射天天综合网| 国产成人夜间影院在线观看| 欧美偷拍综合| 五月天激情综合| jizz免费一区二区三区| 久久精品亚洲欧美日韩精品中文字幕| av自拍一区| 午夜久久福利视频| 在线欧美日韩| 国产剧情在线观看一区| 久久久久久国产精品日本| 影音先锋5566资源站| 亚洲制服中文字幕| 高清av不卡| 91首页免费视频| 五月精品在线| 亚洲美女在线国产| 1区1区3区4区产品乱码芒果精品| 女子免费在线观看视频www| 国产69精品久久app免费版| 日韩深夜影院| 久久久久资源| 91av视频在线| 一级在线观看| 成人黄色av片| 亚洲黄色小说网| 久久gogo国模啪啪裸体| 九七影院97影院理论片久久| 久久国产精品波多野结衣av| а√天堂资源地址在线下载| 亚洲欧美日本国产有色| 欧美婷婷精品激情| 日韩视频网站在线观看| 久久久亚洲av波多野结衣| 三级在线观看免费大全| 男女视频网站免费观看| 国产伦精品一区二区三区精品视频| 在线免费观看日韩视频| 国产伦精品一区二区三区照片| 黄色福利视频网站| 蜜桃精品一区二区三区| 日韩欧美国产一区二区三区| 午夜视频在线观看网站| 91蜜桃婷婷狠狠久久综合9色| 操bbb操bbb| 国产乱淫a∨片免费观看| 三级小说欧洲区亚洲区| 黄色一级大片在线免费看国产一| 日本亚洲不卡| 欧美五级在线观看视频播放| 宅男66日本亚洲欧美视频| 国内露脸中年夫妇交换精品| 色视频www在线播放国产成人| www.毛片| 欧美一卡2卡三卡4卡5免费| 成人免费自拍视频| 宅男在线一区| 伦理欧美一区| 国产一区二区高清视频| а√最新版天堂中文在线| 色视频www在线播放| 女同性互吃奶乳免费视频| 巨胸喷奶水www久久久免费动漫| 欧美在线视频网站| 欧美视频久久久| 中文字幕日本乱码精品影院| 综合图区亚洲白拍在线| 日韩资源在线观看| 99热播精品免费| 国产精品久久久久久久免费软件| 国产69精品久久久久孕妇| 先锋影音男人站| 国产精品.www| 91精品免费久久久久久久久| 国产91精品久久久久久久网曝门| 亚洲aⅴ怡春院| 亚洲综合20p| 久久久国产影院| 亚洲天堂久久久久久久| 五月激情丁香一区二区三区| 欧美成人精品一区二区男人看| 1024亚洲| 日本三级免费观看| 久久久人成影片一区二区三区| 久久男人av| 被弄出白浆喷水了视频| 久久久久无码国产精品不卡| 久久久久久久国产精品影院| 青青草91久久久久久久久| 国产剧情av片巨作醉酒女邻居| 国产96在线 | 亚洲| 成人免费毛片片v| 人人澡人人澡人人看欧美| 99精品黄色片免费大全| 丝袜美女写真福利视频| 在线看的毛片| 懂色av粉嫩av蜜臀av一区二区三区| 中文字幕中文字幕精品| 人妻少妇精品无码专区久久| 精品二区久久| 欧美日本国产| 四虎影院成人在线观看| 97免费资源站| 久久久一区二区| 午夜黄色小视频| 无码人妻丰满熟妇区bbbbxxxx| 一本精品一区二区三区| 在线电影一区| 国产精品扒开腿做爽爽爽男男| aa级大片欧美| 日本人亚洲人jjzzjjz| 中文字幕4区| 国产麻豆剧传媒精品国产| 欧美sm一区| 国产精品乱码一区二三区小蝌蚪| 亚洲免费在线电影| 欧美成人午夜剧场免费观看| 91中文字幕网| 无码人妻精品一区二区三应用大全| 色偷偷av一区二区三区| 婷婷伊人综合中文字幕| 熟妇人妻无乱码中文字幕真矢织江| 国产精品乱人伦一区二区| 九一精品在线观看| 91在线国产电影| 大黑人xxx| yy111111少妇嫩草影院| 欧美黄色免费网站| 免费观看黄色大片| 亚洲成人精品一区二区| 欧美男女性生活在线直播观看| 国产性xxxx| xxx欧美尤物xxx| 欧美电影免费观看| 亚洲国产成人无码av在线| 欧美午夜宅男影院在线观看| 色婷婷精品久久二区二区蜜臀av| 国产精品三区www17con| 国产一级大片在线观看| 性一交一乱一透一a级| 欧美日韩高清一区二区三区| 川上优的av在线一区二区| 最新版天堂中文在线官网| av在线app| 亚洲第一视频在线观看| 国产精品乱码一区二区三区视频| 亚洲成人tv| 天堂在线视频网站| 日本一区二区免费在线| 九一国产精品视频| 中文字幕 自拍| 亚洲国产一区二区在线播放| 亚洲国产成人在线播放| 欧美日韩一区二区三区在线播放| 男女男精品视频网站| 国产伦精品一区二区三区高清版| 一级片在线播放| 亚洲国产毛片完整版| 国模叶桐国产精品一区| 亚洲国产精品久久久久爰色欲| 欧美亚洲在线视频| 精品久久免费看| 久久精品不卡| 免费人成年激情视频在线观看| 欧美电影完整版在线观看| 免费观看一级特黄欧美大片| 国产精品∨欧美精品v日韩精品| 久久中文字幕电影| 国产亚洲美州欧州综合国| 日日摸日日添日日躁av| 久久蜜桃精品| 久久国产精品久久精品国产|