@@ -42,11 +42,27 @@ public boolean onKey(int keyCode, KeyEvent event) {
4242 }
4343 };
4444
45+ private final Runnable mInAnimEndCallback = new Runnable () {
46+ @ Override
47+ public void run () {
48+ Layer .this .handleInAnimEnd ();
49+ }
50+ };
51+
52+ private final Runnable mOutAnimEndCallback = new Runnable () {
53+ @ Override
54+ public void run () {
55+ Layer .this .handleOutAnimEnd ();
56+ }
57+ };
58+
4559 private final ViewManager mViewManager ;
4660 private final ViewHolder mViewHolder ;
4761 private final ListenerHolder mListenerHolder ;
4862 private final Config mConfig ;
4963
64+ private ViewTreeObserver .OnPreDrawListener mShowOnPreDrawListener = null ;
65+
5066 private boolean mShowWithAnim = false ;
5167 private boolean mDismissWithAnim = false ;
5268
@@ -192,38 +208,32 @@ protected void onGlobalPreDraw() {
192208 private void handleShow () {
193209 if (isShown ()) {
194210 if (isOutAnimRunning ()) {
195- startAnimatorIn (new Runnable () {
196- @ Override
197- public void run () {
198- onShow ();
199- }
200- });
211+ startAnimatorIn ();
201212 }
202213 return ;
203214 }
204215 onCreate ();
205216 mViewManager .attach ();
206217 onAttach ();
207218 getViewHolder ().getChild ().setVisibility (View .VISIBLE );
208- getViewTreeObserver ().addOnPreDrawListener (new ViewTreeObserver .OnPreDrawListener () {
209- @ Override
210- public boolean onPreDraw () {
211- if (getViewTreeObserver ().isAlive ()) {
212- getViewTreeObserver ().removeOnPreDrawListener (this );
213- }
214- onAppear ();
215- startAnimatorIn (new Runnable () {
216- @ Override
217- public void run () {
218- onShow ();
219+ if (mShowOnPreDrawListener == null ) {
220+ mShowOnPreDrawListener = new ViewTreeObserver .OnPreDrawListener () {
221+ @ Override
222+ public boolean onPreDraw () {
223+ mShowOnPreDrawListener = null ;
224+ if (getViewTreeObserver ().isAlive ()) {
225+ getViewTreeObserver ().removeOnPreDrawListener (this );
219226 }
220- });
221- return true ;
222- }
223- });
227+ onAppear ();
228+ startAnimatorIn ();
229+ return true ;
230+ }
231+ };
232+ }
233+ getViewTreeObserver ().addOnPreDrawListener (mShowOnPreDrawListener );
224234 }
225235
226- private void startAnimatorIn (@ NonNull Runnable onEnd ) {
236+ private void startAnimatorIn () {
227237 cancelAnimator ();
228238 if (mShowWithAnim ) {
229239 mAnimatorIn = onCreateInAnimator (mViewHolder .getChild ());
@@ -237,34 +247,41 @@ public void onAnimationEnd(Animator animation) {
237247
238248 @ Override
239249 public void onAnimationEndWithoutCancel (Animator animation ) {
240- onEnd .run ();
250+ super .onAnimationEndWithoutCancel (animation );
251+ mInAnimEndCallback .run ();
241252 }
242253 });
243254 mAnimatorIn .start ();
244255 } else {
245- onEnd .run ();
256+ mInAnimEndCallback .run ();
246257 }
247258 } else {
248- onEnd .run ();
259+ mInAnimEndCallback .run ();
249260 }
250261 }
251262
263+ private void handleInAnimEnd () {
264+ onShow ();
265+ }
266+
252267 private void handleDismiss () {
253268 if (!isShown ()) return ;
254269 if (isOutAnimRunning ()) return ;
255- onDismiss ();
256- startAnimatorOut (new Runnable () {
257- @ Override
258- public void run () {
259- onDisappear ();
260- mViewManager .detach ();
261- onDetach ();
262- onDestroy ();
270+ if (mShowOnPreDrawListener != null ) {
271+ mShowOnPreDrawListener = null ;
272+ if (getViewTreeObserver ().isAlive ()) {
273+ getViewTreeObserver ().removeOnPreDrawListener (mShowOnPreDrawListener );
263274 }
264- });
275+ mViewManager .detach ();
276+ onDetach ();
277+ onDestroy ();
278+ return ;
279+ }
280+ onDismiss ();
281+ startAnimatorOut ();
265282 }
266283
267- private void startAnimatorOut (@ NonNull final Runnable onEnd ) {
284+ private void startAnimatorOut () {
268285 cancelAnimator ();
269286 if (mDismissWithAnim ) {
270287 mAnimatorOut = onCreateOutAnimator (mViewHolder .getChild ());
@@ -278,33 +295,45 @@ public void onAnimationEnd(Animator animation) {
278295
279296 @ Override
280297 public void onAnimationEndWithoutCancel (Animator animation ) {
298+ super .onAnimationEndWithoutCancel (animation );
281299 // 动画执行结束后不能直接removeView,要在下一个dispatchDraw周期移除
282300 // 否则会崩溃,因为viewGroup的childCount没有来得及-1,获取到的view为空
283301 getViewHolder ().getChild ().setVisibility (View .INVISIBLE );
284- getViewHolder ().getParent ().post (onEnd );
302+ getViewHolder ().getParent ().post (mOutAnimEndCallback );
285303 }
286304 });
287305 mAnimatorOut .start ();
288306 } else {
289307 getViewHolder ().getChild ().setVisibility (View .INVISIBLE );
290- onEnd .run ();
308+ mOutAnimEndCallback .run ();
291309 }
292310 } else {
293311 getViewHolder ().getChild ().setVisibility (View .INVISIBLE );
294- onEnd .run ();
312+ mOutAnimEndCallback .run ();
295313 }
296314 }
297315
316+ private void handleOutAnimEnd () {
317+ onDisappear ();
318+ mViewManager .detach ();
319+ onDetach ();
320+ onDestroy ();
321+ }
322+
298323 private ViewTreeObserver getViewTreeObserver () {
299324 return getViewHolder ().getParent ().getViewTreeObserver ();
300325 }
301326
302327 private void cancelAnimator () {
328+ getViewHolder ().getParent ().removeCallbacks (mInAnimEndCallback );
329+ getViewHolder ().getParent ().removeCallbacks (mOutAnimEndCallback );
303330 if (mAnimatorIn != null ) {
331+ mAnimatorIn .removeAllListeners ();
304332 mAnimatorIn .cancel ();
305333 mAnimatorIn = null ;
306334 }
307335 if (mAnimatorOut != null ) {
336+ mAnimatorOut .removeAllListeners ();
308337 mAnimatorOut .cancel ();
309338 mAnimatorOut = null ;
310339 }
0 commit comments