我正在爲我的Android應用程序動畫自定義視圖。我已經通過Property Animations做到了這一點,並在該onAnimationUpdate()
回調查看調用invalidate()
,按https://developer.android.com/guide/topics/graphics/prop-animation.html:活動開始時的動畫跳轉
根據什麼屬性或對象的動畫,你可能需要調用無效()方法上查看強制屏幕使用更新後的動畫值重繪本身。您可以在onAnimationUpdate()回調中執行此操作。
我的問題是,當這些動畫在新推出活動開始運行,它們在一開始跳幀,使他們很明顯跳躍。我曾經嘗試都:
- 從活動的
onCreate()
方法 - 立即啓動動畫開始使用活動的根視圖的ViewTreeObserver於
OnGlobalLayout()
回調動畫。
我做了後者,因爲我認爲動畫是在佈局完成前調用的,但結果是一樣的。
對於日誌,我確定在整個動畫中(即從開始到結束每隔10-20毫秒左右)一致地調用onAnimationUpdate()
回調。 onAnimationUpdate()
只需調用invalidate()
,這應該強制視圖重繪自己,理想情況下立即(但文檔只聲稱這發生在「未來的某個時刻」)。這似乎正是問題所在:onDraw()
只在一開始被調用一次或兩次,之後不被調用約250 ms。之後,它每10-20毫秒重新開始一次,因爲它應該有整個時間。但是這段時間會在動畫中引起非常明顯的滯後。
要清楚,這個問題只發生在活動的開始。如果我在開始動畫之前簡單地設置300毫秒的延遲時間,它會一直流暢運行。但我不喜歡這個解決方案,因爲它很不好。看起來問題是onDraw()
在活動開始附近的invalidate()
不立即被調用。但是,我不明白爲什麼會這樣,阻止onDraw()
,或者如何解決它。
我發現只有這個StackOverFlow線程:Animation at the beginning of activity skips frames其中海報有相同的問題。基本代碼在那裏,視頻使問題變得清晰。我也可以發佈我的代碼,但我認爲問題出現在最基本的測試應用程序中,這表明還有其他事情正在發生。
我沒有自定義過渡動畫,但默認情況下有一個。按照建議禁用過渡動畫確實可以修復動畫。但是,由於這個問題,我發現了下面的Activity回調:[onEnterAnimationComplete()](https://developer.android.com/reference/android/app/Activity.html#onEnterAnimationComplete())。這個問題在那裏正式解釋說:「活動在他們的窗戶正在進行動畫活動期間無法繪製。」從回調開始我的動畫修復了這個問題。 – asaini007
@ asaini007該方法在那裏,但是...只能從API 21獲得。順便說一句,它不是一直在工作。 –