10

我正在爲我的Android應用程序動畫自定義視圖。我已經通過Property Animations做到了這一點,並在該onAnimationUpdate()回調查看調用invalidate(),按https://developer.android.com/guide/topics/graphics/prop-animation.html活動開始時的動畫跳轉

根據什麼屬性或對象的動畫,你可能需要調用無效()方法上查看強制屏幕使用更新後的動畫值重繪本身。您可以在onAnimationUpdate()回調中執行此操作。

我的問題是,當這些動畫在新推出活動開始運行,它們在一開始跳幀,使他們很明顯跳躍。我曾經嘗試都:

  1. 從活動的onCreate()方法
  2. 立即啓動動畫開始使用活動的根視圖的ViewTreeObserverOnGlobalLayout()回調動畫。

我做了後者,因爲我認爲動畫是在佈局完成前調用的,但結果是一樣的。

對於日誌,我確定在整個動畫中(即從開始到結束每隔10-20毫秒左右)一致地調用onAnimationUpdate()回調。 onAnimationUpdate()只需調用invalidate(),這應該強制視圖重繪自己,理想情況下立即(但文檔只聲稱這發生在「未來的某個時刻」)。這似乎正是問題所在:onDraw()只在一開始被調用一次或兩次,之後不被調用約250 ms。之後,它每10-20毫秒重新開始一次,因爲它應該有整個時間。但是這段時間會在動畫中引起非常明顯的滯後。

要清楚,這個問題只發生在活動的開始。如果我在開始動畫之前簡單地設置300毫秒的延遲時間,它會一直流暢運行。但我不喜歡這個解決方案,因爲它很不好。看起來問題是onDraw()在活動開始附近的invalidate()不立即被調用。但是,我不明白爲什麼會這樣,阻止onDraw(),或者如何解決它。

我發現只有這個StackOverFlow線程:Animation at the beginning of activity skips frames其中海報有相同的問題。基本代碼在那裏,視頻使問題變得清晰。我也可以發佈我的代碼,但我認爲問題出現在最基本的測試應用程序中,這表明還有其他事情正在發生。

回答

5

由於沒有附加代碼,我假設你有一些過渡動畫的活動。如果是這種情況,可能會導致問題。因爲有兩個動畫同時運行。禁用轉換並嘗試。

startActivity(intent); 
getActivity().overridePendingTransition(0, 0); 
+1

我沒有自定義過渡動畫,但默認情況下有一個。按照建議禁用過渡動畫確實可以修復動畫。但是,由於這個問題,我發現了下面的Activity回調:[onEnterAnimationComplete()](https://developer.android.com/reference/android/app/Activity.html#onEnterAnimationComplete())。這個問題在那裏正式解釋說:「活動在他們的窗戶正在進行動畫活動期間無法繪製。」從回調開始我的動畫修復了這個問題。 – asaini007

+0

@ asaini007該方法在那裏,但是...只能從API 21獲得。順便說一句,它不是一直在工作。 –

2

聽起來像你的繪製循環UI線程變得餓死了。

我會使用traceview來確保沒有任何方法阻止您的繪製調用。http://tools.android.com/tips/traceview

這應該可以幫助您確定什麼被調用,而不是onDraw方法。