日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 系統 > Android > 正文

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

2019-10-21 21:25:32
字體:
來源:轉載
供稿:網友

前言

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

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

Android,動效,卡片切換視圖

思路

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

其次,要能夠方便的定義卡片視圖內容。我們通過都很熟悉的設置Adapter的方式來構建內容視圖。

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

總覽

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

/* * ANIM_TYPE_FRONT:被選中的卡片通過自定義動效移至第一,其他的卡片通過通用動效補位 * ANIM_TYPE_SWITCH:選中的卡片和第一張卡片互換位置,并都是自定義動效 * ANIM_TYPE_FRONT_TO_LAST:第一張圖片通過自定義動效移至最后,其他卡片通過通用動效補位 */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時根據卡片寬高比來設置卡片的尺寸,在此請注意,當前情況下卡片寬度與整體容器寬度一致,后續通過自定義的方式,通過縮放來產生卡片的視覺效果。

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

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

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

細節

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

首先,在ValueAnimator更新的時候,獲得當前的動畫系數,依次來執行動畫

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

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

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

最后,通過轉換器,對卡片進行自定義動畫處理

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

而轉換器的具體實現則以DefaultCommonTransformer為例

@Overridepublic void transformAnimation(View view, float fraction, int cardWidth, int cardHeight, int fromPosition, int toPosition) {  //需要跨越的卡片數量  int positionCount = fromPosition - toPosition;  //以0.8做為第一張的縮放尺寸,每向后一張縮小0.1  //(0.8f - 0.1f * fromPosition) = 當前位置的縮放尺寸  //(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));}

對于向第一位移動的選中卡片,也是同理,只不過是根據該卡片對應的轉換器來進行自定義動畫的轉換。

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

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
深夜福利亚洲| 日韩三区免费| 伊人www22综合色| 亚洲福利在线观看| 国产 日韩 欧美 综合| 日韩精品一区二区三区视频播放| 日韩www在线| 欧美日韩精品不卡| 久久久久黄色| 欧美日韩午夜精品| 亚洲一区在线观看视频| 国产高清精品二区| 久久久精品网| 日韩免费高清一区二区| 欧美sm一区| 欧美日韩精品是欧美日韩精品| 日韩在线三区| 精品久久91| 91精品国产高清| 日韩在线视频网| 97caopor国产在线视频| 国产欧美综合在线| 日韩精品在线网站| 国产中文在线观看| 日本精品二区| 国产一级片网站| 中文字幕一区二区三区精品| 午夜国产视频| 正在播放日韩精品| 久精品在线观看| 一区三区二区视频| 日韩国产91| 一区二区在线视频播放| 伊人精品视频| 国产欧美久久久| 久久99精品久久久久久青青日本| 日本黄色一区二区三区| 亚洲a中文字幕| 国产95在线|亚洲| 亚洲一区在线观看网站| 国产99在线 | 亚洲| 亚洲综合在线中文字幕| 久久精品国产91精品亚洲| 中文字幕第一页在线播放| 欧美高清一级片在线| 精品乱人伦一区二区三区| 亚洲二区自拍| 亚洲最新永久观看在线| 国产婷婷精品| 午夜成人鲁丝片午夜精品| 91精品国产自产观看在线| 国产视频二区| 中文字幕 欧美 日韩| 亚洲二区自拍| 中文字幕精品在线视频| 国产小视频在线观看免费| 不卡av免费在线| 精品久久蜜桃| 国产99对白在线播放| 亚洲欧洲三级| 国产三级中文字幕| 精品999视频| 亚洲中文字幕在线一区| 日韩欧美中文| 日韩wumaV| 不卡一二三区| 麻豆精品99| 一区三区视频| 91精品视频播放| 阿v免费在线观看| 日韩欧美国产综合| 国产一卡2卡3卡4卡网站免费| www.中文字幕在线| 亚洲欧美中文字幕在线观看| 国产123在线| 欧美日韩高清一区二区| 日韩欧美一二三| 久久夜色精品国产欧美乱极品| 粉嫩粉嫩芽的虎白女18在线视频| 欧美日韩亚洲综合| 精品成人久久av| 久久91精品国产91久久小草 | 国产三级视频在线| 69堂精品视频在线播放| 亚洲视频资源在线| 国产在线高清精品| 中文字幕精品视频在线| a天堂在线资源| av免费观看国产| www.中文字幕在线| 国精品产品一区| 国产绿帽一区二区三区| 欧美久久综合性欧美| 999在线视频| 亚洲综合日韩| 中文字幕在线观看国产| 99精品999| 91精品久久久久久蜜臀| 国产黄在线播放| 91精选在线| 美女免费视频一区| 国产www.大片在线| 久久视频在线免费观看| 精品国产免费视频| 蜜桃视频一日韩欧美专区| 亚洲娇小xxxx欧美娇小| 91精品国产91久久久久久不卡| www.中文字幕在线观看| 国产视频aaa| 国产欧美日韩中文久久| 91久久久精品| 国产一级久久久| 久草视频观看| 国产网站欧美日韩免费精品在线观看 | 欧美亚洲国产免费| 精品久久久久久综合日本欧美| 在线观看区一区二| 日韩欧美专区在线| 日韩国产一区久久| 欧美.日韩.国产.一区.二区| 色猫猫国产区一区二在线视频 | 尤物av一区二区| 91精品国产经典在线观看| 欧美日韩国产专区| 婷婷中文字幕综合| 91精品观看| 欧美国产综合视频| 欧美日韩综合在线免费观看| 日韩欧美高清在线视频| 中文字幕在线观看国产| 欧美日韩视频免费| 欧美日韩精品欧美日韩精品一| 国产视频中文字幕在线观看| 欧美日韩国产不卡| 免费高清特黄a大片| 亚洲伊人婷婷| 亚洲欧洲三级| 99精品免费观看| 欧美日韩精品三区| 亚洲高清中文字幕| 一区二区中文字幕在线| 国产激情久久久| 亚洲娇小xxxx欧美娇小| 国产日韩综合| 一区二区在线高清视频| 亚洲一区在线观看免费| 精品日韩欧美在线| 欧美日韩第一| 国产亚洲视频中文字幕视频| 欧美日韩国产免费观看视频| 国产婷婷精品| 国产欧美日韩不卡| 日韩国产在线不卡视频| 99久久久精品免费观看国产| 日韩亚洲欧美中文在线| 欧美熟妇乱码在线一区| 中文字幕日韩视频| 91精品国产网站| 国产在线视频不卡| 日韩在线二区| 91精品国产色综合久久久蜜香臀 | 中文字幕在线看视频国产欧美| 精品免费久久久| 视频一区二区精品的福利| 亚洲精品欧美二区三区中文字幕| 色偷偷一区二区三区| 亚洲高清视频一区| 国产嫩草影院久久久久| 亚洲欧洲综合另类| 欧美wwww| 中文在线第一页| 最新中文字幕在线播放| 黄色一区二区在线| 中文字幕日韩视频| 久久精品国产2020观看福利| 国内精品不卡| 亚洲一二三不卡| 先锋男人资源站| 久久久99精品久久| 中文字幕欧美亚洲| 中文字幕第一页在线播放| 麻豆一区二区99久久久久| 欧美黄页在线免费观看| 中文字幕乱码在线| 91精品国产免费| 日韩在线精品| 国产不卡一区| 日韩欧美中文在线视频| 亚洲黄在线观看| 欧美日韩国产一区在线| 日韩精品中文字幕第1页| 91精品国产免费久久综合| 国产羞羞视频在线播放| 日韩欧美亚洲区| 亚洲九九精品| 国产又粗又猛又爽又黄91精品| 国产导航在线| 91精品在线观| 日韩欧美一级视频| 国产日韩精品在线看| 日韩欧美国产片| 久久精品国产91精品亚洲| 国产一级在线| 精品成人久久久| 国产一级片在线播放| 免费看日韩精品| 天堂√8在线中文| 一区二区三区免费看视频 | 日韩欧美在线中字| 中文字幕久精品免费视频| 97最新国自产拍视频在线完整在线看| 欧美日韩中文字幕视频| 91九色在线播放| 中文字幕在线导航| 欧美日韩国产免费观看| 一区二区不卡在线| 国产欧美日韩视频| 精品熟女一区二区三区| 精品国自产在线观看| 国产丝袜在线播放| 亚洲社区在线| 樱花草www在线| 日韩视频中文字幕| a在线观看免费视频| 国产v日产∨综合v精品视频| 中文天堂在线一区| 欧美日韩精品不卡| 亚洲乱码中文字幕| 一级片免费在线播放| 二区三区中文字幕| 欧美亚洲免费高清在线观看| 国产一级在线免费观看| 97最新国自产拍视频在线完整在线看 | 国产在线看一区| 91麻豆精品国产91久久久使用方法| 日韩欧美中文视频| 久久福利视频一区二区| 欧美 日韩 国产在线| 亚洲一区视频在线观看视频| 国产蜜臀在线| 欧美久久久久久蜜桃| 日韩欧美国产网站| 亚洲一区中文字幕在线| 日韩欧美中文字幕公布| 二区三区不卡不卡视频| 一二三区精品视频| 中文亚洲欧美| 欧美日韩精品免费看| 中文字幕欧美日韩在线| 欧美在线视频一区二区| 亚洲高清中文字幕| 欧美不卡123| 日韩在线一区二区视频| 欧美日韩精品区| 亚洲第一精品在线| 国产资源在线观看| 成年人黄国产| 欧美日韩成人综合| 国产三级中文字幕| 一区二区三区在线不卡| 91亚洲国产| 一区视频在线播放| 亚洲欧美伊人| 亚洲狠狠婷婷综合久久久久图片| 97视频在线| www.尤物.com| 91精品视频国产| 国产网站av| 人人做人人澡人人爽欧美| 国内精品99| 欧美日韩在线不卡| 在线精品视频免费播放| 欧美在线中文字幕| av影视在线看| 91麻豆视频网站| 欧美日韩国产专区| 国产在线黄色| 日韩在线小视频| √新版天堂资源在线资源| 日韩中文在线字幕| 中文字幕综合在线| 亚洲开心激情| 顶级网黄在线播放| 91精品国产综合久久香蕉最新版 | 日韩欧美中文视频| 亚洲永久免费视频| 精品视频在线导航| 91精品观看| 999视频精品| 久久久精品网| 一区二区精品| 欧美日韩亚洲综合在线| 精品久久在线| 精品三区视频| 精品视频国产| 成人一区而且| 国产视频一区三区| 午夜av一区| 色综合天天综合网天天狠天天 | 国产欧美久久久精品免费| 欧美婷婷久久| 日韩欧美综合视频| 免费看黄资源大全高清| 欧美日韩亚洲第一| 91精品国产自产| 中文字幕亚洲高清| 日韩在线观看视频一区二区| 欧美一级在线免费| 欧美日韩精品不卡| 国产乱码在线| 深夜福利一区| 欧美三级在线看| 中文网丁香综合网| 亚洲图片小说综合| 久久蜜桃精品| 久久夜色精品国产欧美乱极品| 亚洲精品中文字幕乱码三区| 国产极品嫩模在线视频一区 | 国产午夜精品视频| 亚洲一级二级| 中文在线日韩| 亚洲视频在线观看日本a | 精品久久蜜桃| 日韩午夜一区| 中文字幕在线观看欧美| 在线观看区一区二| 欧美亚洲天堂| 一区二区三区免费看视频| 欧美日韩不卡在线视频| 99精品免费观看| 精品久久人人做人人爽| 国产乱码在线观看| 蜜桃久久久久| 在线不卡一区二区| 国产h片在线观看| 欧美日韩亚洲系列| 亚洲丝袜一区| 欧美久久久久久蜜桃| 日韩影院二区| 99视频在线看| 在线看欧美日韩| www.老鸭窝.com| 久久久99免费| 色综合天天性综合| 999精品在线| 一区二区精品免费| 日韩在线中文视频| 久久久99精品久久| 欧美日韩亚洲国内综合网| 欧美中文字幕视频| 91精品婷婷国产综合久久| 亚洲社区在线| 日韩手机在线观看视频| 日韩欧美一级二级三级久久久 | 亚洲大片精品永久免费| 欧美日韩精品是欧美日韩精品| 欧美 日韩 综合| 中文字幕欧美国内| 日韩国产一区三区| 欧美日韩亚州综合| 国产美女主播视频一区| 91久久久精品国产| 国产日韩免费| 欧美自拍一区| 亚洲一二三不卡| 国产99对白在线播放| 亚洲福利精品| 中文在线视频| 日本亚洲欧美| 午夜国产视频| 欧美日韩中文字幕| 九九九精品视频| 91精品久久久久久蜜臀| 欧美日韩国产一二| 日韩在线观看视频一区| 国产午夜精品久久| 91欧美日韩在线| 欧美日韩激情一区| 色综合久久六月婷婷中文字幕| 日韩免费电影网站| 国产欧美三级| 欧美日韩国产在线| 中文字幕亚洲视频| 久久精品网站免费观看| www.中文字幕在线观看| 中文字幕 乱码 中文乱码91| 国产 欧美 日韩 在线| 欧美日韩高清在线播放| 免费看黄资源大全高清| 国产在线一区二区视频| 日韩三级视频在线播放| 91精品国产网站| 午夜成人鲁丝片午夜精品| 中文在线不卡| 欧美中文字幕在线| 欧美国产一级片| 日韩精品手机在线观看| 日韩精品在线视频观看| 亚洲 欧美 中文字幕| 狠狠色噜噜狠狠狠狠97|