????????最近使用網(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)小伙伴們指出,? 話不多說看下效果~
????????動(dòng)畫效果就是上邊圖片這樣忘古,是不是還蠻有意思的??徘禁,關(guān)于動(dòng)畫的思路我做了個(gè)思維導(dǎo)圖,這只是我自己的思路髓堪,小伙伴們有更好的思路咱們可以互相討論哦
????????動(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回怜,代碼如下
????????自定義ViewGroup的常規(guī)步驟,就不詳說了换薄,然后就開始View的創(chuàng)建與確定位置玉雾,首先創(chuàng)建View翔试,然后在onLayout()中確定它們ViewGroup中的位置
????????關(guān)于View位置的確定我簡(jiǎn)單的畫了個(gè)草圖,畫圖技術(shù)很菜抹凳,請(qǐng)小伙伴們多多諒解
????????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)行操作延刘,代碼如下
????????主要使用setTranslationX()方法與setRotation()方法進(jìn)行平移和旋轉(zhuǎn)漫试,主要的動(dòng)畫是在 MotionEvent.ACTION_UP時(shí)操作,代碼如下
????????兩種情況—超過滑動(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)手吧
? ??