問題描述
最近在項目中遇到一個關於共享元素動畫失效的問題,在Activity跳轉時使用ActivityOptionsCompat.makeSceneTransitionAnimation
作轉場動畫, 對於Activity共享元素動畫的使用不懂的童鞋自行谷歌,網上資料太多,這裏就不作描述了。git
通常狀況下使用ActivityOptionsCompat.makeSceneTransitionAnimation
作轉場動畫時,當Activity返回時也會伴隨返回的動畫。可是就是這樣的一個簡單的API, 竟然在Android 10上測試出現了異常:github
若是使用了
ActivityOptionsCompat.makeSceneTransitionAnimation
跳轉的Activity沒有再次跳轉到別的Activity的話,返回時系統是帶上響應的共享元素動畫的, 可是若是跳轉的Activity再次跳轉了其餘的Activity,而後再返回的話共享元素的返回動畫就失效了(包括按了Home鍵退回桌面,而後再次進入也會失效)。微信
筆者的測試手機是華爲nova 5i
,系統是Android 10
。app
問題追蹤
一、 大神方案測試
當筆者看到這個bug的時候,首先想到的多是我打開的方式不對,因而谷歌百度了一波,結果確實無功而返。動畫
因而筆者第一想到的就是是否是本身的使用方式不對,因而看看大神是怎麼使用的,而後參考了一下Android 大神郭霖開源的一個開源項目giffun
, 發現giffun
也存在一樣的異常...spa
爲此我專門給giffun
提了一個issue:.net
https://github.com/guolindev/giffun/issues/67code
絕望了。。。。。。。orm
二、 競品對比
既然查找不到相關的資料,那麼就看看競品是否也有這樣的問題的,若是競品也有這樣的問題話就能夠拿着競品去忽悠產品了,內心美滋滋。
因而筆者對比了一下競品的產品是否也存在這麼的一個bug,發現競品沒有同樣的bug,它們的共享元素動畫一切正常。後面經過研究了它們的APK才發現它們的共享元素動畫是使用Fragment作的,因此儘可能使用Fragment的一個好處又體現出來了。
可是筆者今天要說的將Activity的轉場動畫改成Fragment這樣就完事了,今天將帶你們一步一步分析共享元素動畫是如何失效的,如何修復這樣的一個bug。
三、 源碼先行
既然網上沒有這樣的資料,那就本身動手,豐衣足食了。首先咱們初步看看Activity
的源碼,發現若是是返回執行共享元素動畫的話執行的方法是finishAfterTransition
。 在finishAfterTransition
裏面調用了ActivityTransitionState
的startExitBackTransition
方法。
然而看源碼並無看出什麼破綻,畢竟大多數手機是正常的,只有在Android 10上纔出現了異常。既然這條路走不通,那咱們就換一個途徑吧。
四、 Debug大法
本文分享自微信公衆號 - 思想覺悟(ChuanFlyer)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。