diff --git a/library/src/main/java/com/daasuu/library/Container.java b/library/src/main/java/com/daasuu/library/Container.java index cb61055..051683b 100644 --- a/library/src/main/java/com/daasuu/library/Container.java +++ b/library/src/main/java/com/daasuu/library/Container.java @@ -99,11 +99,12 @@ public Container addChildAt(int location, @NonNull DisplayObject DisplayObject) /** * Removes the specified child from the display list. * - * @param DisplayObject DisplayObject + * @param displayObject DisplayObject * @return this */ - public Container removeChild(@NonNull DisplayObject DisplayObject) { - mDisplayList.remove(DisplayObject); + public Container removeChild(@NonNull DisplayObject displayObject) { + displayObject.disable(); + mDisplayList.remove(displayObject); return this; } @@ -114,7 +115,10 @@ public Container removeChild(@NonNull DisplayObject DisplayObject) { * @return this */ public Container removeChildAt(int location) { - mDisplayList.remove(location); + DisplayBase removed = mDisplayList.remove(location); + if (removed != null) { + removed.disable(); + } return this; } diff --git a/library/src/main/java/com/daasuu/library/DisplayBase.java b/library/src/main/java/com/daasuu/library/DisplayBase.java index d60bb6d..dabeb9a 100644 --- a/library/src/main/java/com/daasuu/library/DisplayBase.java +++ b/library/src/main/java/com/daasuu/library/DisplayBase.java @@ -20,12 +20,17 @@ public abstract class DisplayBase { protected Drawer mDrawer; + private boolean mIsEnable; + /** * call from FPSTextureView or FPSSurfaceView when it is addChild. * * @param fps Set in FPSTextureView or FPSSurfaceView. */ void setUp(long fps) { + synchronized (this) { + mIsEnable = true; + } mAnimator.setUp(fps); } @@ -60,9 +65,13 @@ public DisplayBase animator(@NonNull Animator animator) { * @param canvas This Canvas acquired by lookCanvas in FPSTextureView or FPSSurfaceView. */ void draw(@NonNull Canvas canvas) { - mAnimator.setBaseLine(canvas, mDrawer.getWidth(), mDrawer.getHeight()); - mAnimator.updateAnimParam(mAnimParameter); - mDrawer.draw(canvas, mAnimParameter.x, mAnimParameter.y, mAnimParameter.alpha, mAnimParameter.scaleX, mAnimParameter.scaleY, mAnimParameter.rotation); + synchronized (this) { + if (mIsEnable) { + mAnimator.setBaseLine(canvas, mDrawer.getWidth(), mDrawer.getHeight()); + mAnimator.updateAnimParam(mAnimParameter); + mDrawer.draw(canvas, mAnimParameter.x, mAnimParameter.y, mAnimParameter.alpha, mAnimParameter.scaleX, mAnimParameter.scaleY, mAnimParameter.rotation); + } + } } public AnimParameter getAnimParameter() { @@ -87,6 +96,16 @@ public boolean isPause() { return mAnimator.isPause(); } + /** + * disable this display object. + * This call from FPSTextureView, FPSSurfaceView or Container when it is removeChild. + */ + void disable() { + synchronized (this) { + mIsEnable = false; + } + } + /** * Composer provide simple composing interface. */ diff --git a/library/src/main/java/com/daasuu/library/FPSSurfaceView.java b/library/src/main/java/com/daasuu/library/FPSSurfaceView.java index 3a59296..0a27b1c 100644 --- a/library/src/main/java/com/daasuu/library/FPSSurfaceView.java +++ b/library/src/main/java/com/daasuu/library/FPSSurfaceView.java @@ -162,11 +162,12 @@ public FPSSurfaceView addChildAt(int location, @NonNull DisplayBase DisplayBase) /** * Removes the specified child from the display list. * - * @param DisplayBase DisplayBase2 + * @param displayBase DisplayBase2 * @return this */ - public FPSSurfaceView removeChild(@NonNull DisplayBase DisplayBase) { - mDisplayList.remove(DisplayBase); + public FPSSurfaceView removeChild(@NonNull DisplayBase displayBase) { + displayBase.disable(); + mDisplayList.remove(displayBase); return this; } @@ -177,7 +178,10 @@ public FPSSurfaceView removeChild(@NonNull DisplayBase DisplayBase) { * @return this */ public FPSSurfaceView removeChildAt(int location) { - mDisplayList.remove(location); + DisplayBase removed = mDisplayList.remove(location); + if (removed != null) { + removed.disable(); + } return this; } diff --git a/library/src/main/java/com/daasuu/library/FPSTextureView.java b/library/src/main/java/com/daasuu/library/FPSTextureView.java index 71b61b7..3feffa3 100644 --- a/library/src/main/java/com/daasuu/library/FPSTextureView.java +++ b/library/src/main/java/com/daasuu/library/FPSTextureView.java @@ -170,6 +170,7 @@ public FPSTextureView addChildAt(int location, @NonNull DisplayBase displayBase) * @return this */ public FPSTextureView removeChild(@NonNull DisplayBase displayBase) { + displayBase.disable(); boolean a = mDisplayList.remove(displayBase); return this; } @@ -181,7 +182,10 @@ public FPSTextureView removeChild(@NonNull DisplayBase displayBase) { * @return this */ public FPSTextureView removeChildAt(int location) { - mDisplayList.remove(location); + DisplayBase removed = mDisplayList.remove(location); + if (removed != null) { + removed.disable(); + } return this; } diff --git a/library/src/main/java/com/daasuu/library/drawer/BitmapDrawer.java b/library/src/main/java/com/daasuu/library/drawer/BitmapDrawer.java index 01f6d34..0a55025 100644 --- a/library/src/main/java/com/daasuu/library/drawer/BitmapDrawer.java +++ b/library/src/main/java/com/daasuu/library/drawer/BitmapDrawer.java @@ -112,6 +112,11 @@ protected void draw(Canvas canvas, float x, float y) { return; } + if (mBitmap.isRecycled()) { + mBitmap = null; + return; + } + if (mDpSize) { mDpSizeRect.set( x, diff --git a/library/src/main/java/com/daasuu/library/drawer/SpriteSheetDrawer.java b/library/src/main/java/com/daasuu/library/drawer/SpriteSheetDrawer.java index 95e2fd4..14b8390 100644 --- a/library/src/main/java/com/daasuu/library/drawer/SpriteSheetDrawer.java +++ b/library/src/main/java/com/daasuu/library/drawer/SpriteSheetDrawer.java @@ -230,6 +230,11 @@ public boolean isSpritePause() { protected void draw(Canvas canvas, float x, float y) { if (mBitmap == null) return; + if (mBitmap.isRecycled()) { + mBitmap = null; + return; + } + updateSpriteFrame(); mBitmapRect.set((int) (mSpriteSheet.dx), (int) (mSpriteSheet.dy), (int) (mSpriteSheet.dx + mSpriteSheet.frameWidth), (int) (mSpriteSheet.dy + mSpriteSheet.frameHeight));