????????最近使用網(wǎng)易云簽到時(shí)發(fā)現(xiàn)它的樂簽動(dòng)畫效果很不錯(cuò)宪拥,正好抱著回顧下屬性動(dòng)畫跟自定義View的心態(tài)來自己實(shí)現(xiàn)下這個(gè)效果外傅, 其實(shí)自己剛開始寫動(dòng)畫前也會(huì)擔(dān)心寫出來薄声,但是只要沉下心去做锡垄,其實(shí)也沒有特別的難岛心,本人水平有限来破,如果有錯(cuò)誤還請(qǐng)小伙伴們指出,? 話不多說看下效果~
圖1-1 仿網(wǎng)易云樂簽動(dòng)畫
????????動(dòng)畫效果就是上邊圖片這樣忘古,是不是還蠻有意思的??徘禁,關(guān)于動(dòng)畫的思路我做了個(gè)思維導(dǎo)圖,這只是我自己的思路髓堪,小伙伴們有更好的思路咱們可以互相討論哦
圖1-2 動(dòng)畫實(shí)現(xiàn)思路
????????動(dòng)畫的實(shí)現(xiàn)大體分為三個(gè)思路送朱,首先從卡片滑動(dòng)效果入手,仔細(xì)觀察分析動(dòng)畫發(fā)現(xiàn)干旁,圖片左右滑動(dòng)的同時(shí)發(fā)生了一定角度的旋轉(zhuǎn)驶沼,然后就想到了用屬性動(dòng)畫的平移動(dòng)畫與旋轉(zhuǎn)動(dòng)畫,當(dāng)然實(shí)現(xiàn)動(dòng)畫之前先要解決滑動(dòng)問題争群,于是回到了大家熟悉的自定義ViewGroup回怜,代碼如下
圖1-3
圖1-4
圖1-4
圖1-5
????????自定義ViewGroup的常規(guī)步驟,就不詳說了换薄,然后就開始View的創(chuàng)建與確定位置玉雾,首先創(chuàng)建View翔试,然后在onLayout()中確定它們ViewGroup中的位置
圖1-6 創(chuàng)建View
圖1-7 確定子View的位置
????????關(guān)于View位置的確定我簡(jiǎn)單的畫了個(gè)草圖,畫圖技術(shù)很菜抹凳,請(qǐng)小伙伴們多多諒解
圖1-8 View各個(gè)位置的確定
????????left遏餐、right的位置好確定,主要是在top這個(gè)位置赢底,因?yàn)橐獙?shí)現(xiàn)這種疊加的感覺失都,后邊的top要大于前邊的top就能實(shí)現(xiàn)這種效果,我的想法是這樣的幸冻,有更好想法的小伙伴們我們可以一起討論哦粹庞,所以top=View的高度/2,但是效果沒那么好洽损,然后又微調(diào)了下庞溜,具體請(qǐng)看上圖代碼
? ? ? ? 準(zhǔn)備工作已完成,下邊就是重頭戲了碑定,View的滑動(dòng)流码,需要進(jìn)行平移與旋轉(zhuǎn),所以我們需要在 MotionEvent.ACTION_MOVE 時(shí)進(jìn)行操作延刘,代碼如下
圖1-9 view滑動(dòng)
????????主要使用setTranslationX()方法與setRotation()方法進(jìn)行平移和旋轉(zhuǎn)漫试,主要的動(dòng)畫是在 MotionEvent.ACTION_UP時(shí)操作,代碼如下
圖1-10 手指抬起時(shí)滑動(dòng)動(dòng)畫
????????兩種情況—超過滑動(dòng)閾值&&未超過滑動(dòng)閾值時(shí)
????????超過滑動(dòng)閾值時(shí)碘赖,直接滑出屏幕
????????未超過滑動(dòng)閾值時(shí)驾荣,回彈動(dòng)畫并復(fù)位
????????關(guān)于如何判斷左滑還是右滑,請(qǐng)看圖1-9中代碼普泡,大體思路就是記錄MotionEvent.ACTION_DOWN時(shí)的X坐標(biāo)mInitx播掷,然后滑動(dòng)時(shí)根據(jù)移動(dòng)的坐標(biāo)與mInitX做比較,從而判斷是左滑還是右滑
? ? ? ? 如此一來撼班,圖1-2 思維導(dǎo)圖中的第一步就完成了
? ? ? ? 我感覺接下來是整個(gè)動(dòng)畫效果的靈魂了歧匈,類似抽屜效果,卡片向前推進(jìn)效果(因?yàn)槲乙膊恢涝趺唇o他起名字砰嘁,暫時(shí)就叫這個(gè)吧??眯亦,小伙伴們能明白就行)
? ? ? ? ? 仔細(xì)觀察動(dòng)畫不難發(fā)現(xiàn)這個(gè)動(dòng)畫的核心就是放大,當(dāng)?shù)谝粋€(gè)View滑動(dòng)出屏幕后般码,第二個(gè)View會(huì)放大至第一View的大小,并移動(dòng)到第一個(gè)View的所在的位置乱顾,大體思路有了板祝,下邊就開始動(dòng)手吧
? ??
圖1-11 卡片向前推動(dòng)效果
? ? ? ? 因?yàn)榇a有點(diǎn)長(zhǎng)截不全,具體代碼請(qǐng)大家移步到Gitee查看走净,代碼寫的比較亂券时,但是因?yàn)闀r(shí)間關(guān)系孤里,就暫且先這樣了,還望各位小伙伴見諒橘洞,主要使用ObjectAnimator來完成需要實(shí)現(xiàn)的動(dòng)畫效果捌袜,關(guān)于ObjectAnimator不了解的大家可以自行百度
? ? ? ? 主要展示的是三個(gè)View,所以其他View可以隱藏掉炸枣,所以就從position-1虏等、position-2、position-3 入手适肠,至于為什么是減而不是加霍衫,是因?yàn)閂iew是從List集合的后邊往前展示的,即List集合中的最后一個(gè)為屏幕上第一個(gè)展示的View侯养,每個(gè)View執(zhí)行相應(yīng)的放大敦跌,旋轉(zhuǎn),透明動(dòng)畫逛揩,其實(shí)并不復(fù)雜柠傍,就是具體數(shù)值上麻煩一點(diǎn),這樣第二步就完成了
? ? ? ? 最后一步則是需要展示文字辩稽,然后我個(gè)人的想法就是自己去自定義可以帶文字的ImageView惧笛,TextImageView
? ? 繪制比較重要的就是文字換行
圖1-12 繪制換行文字