From 2fc7625fad2dc4cc1dc1d384443d633f8796fd5c Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Tue, 1 Oct 2019 11:09:04 +0200 Subject: [PATCH] Improve overlay add/remove --- .../cameraview/CameraViewTest.java | 27 ++++++++++++++++++ .../otaliastudios/cameraview/CameraView.java | 11 +++++++- .../2019-07-14-watermarks-and-overlays.md | 28 ++++++++++++++----- 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java index 3d7207dd..654dda74 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java @@ -930,6 +930,33 @@ public class CameraViewTest extends BaseTest { verify(cameraView.mOverlayLayout, never()).addView(overlay, params); } + @Test + public void testOverlays_removeOverlayView() { + // First add one. + cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout); + View overlay = new View(getContext()); + OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10); + cameraView.addView(overlay, 0, params); + reset(cameraView.mOverlayLayout); + // Then remove. + cameraView.removeView(overlay); + verify(cameraView.mOverlayLayout, times(1)).isOverlay(params); + verify(cameraView.mOverlayLayout, times(1)).removeView(overlay); + } + + @Test + public void testOverlays_dontRemoveOverlayView() { + // First add a view. + cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout); + View notOverlay = new View(getContext()); + ViewGroup.LayoutParams notOverlayParams = new ViewGroup.LayoutParams(10, 10); + cameraView.addView(notOverlay, notOverlayParams); + reset(cameraView.mOverlayLayout); + // Then remove. + cameraView.removeView(notOverlay); + verify(cameraView.mOverlayLayout, never()).removeView(notOverlay); + } + //endregion // TODO: test permissions diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 45b5f29b..ccbf7428 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -2202,7 +2202,6 @@ public class CameraView extends FrameLayout implements LifecycleObserver { return super.generateLayoutParams(attributeSet); } - // We don't support removeView on overlays for now. @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { if (!mInEditor && mOverlayLayout.isOverlay(params)) { @@ -2212,6 +2211,16 @@ public class CameraView extends FrameLayout implements LifecycleObserver { } } + @Override + public void removeView(View view) { + ViewGroup.LayoutParams params = view.getLayoutParams(); + if (!mInEditor && params != null && mOverlayLayout.isOverlay(params)) { + mOverlayLayout.removeView(view); + } else { + super.removeView(view); + } + } + //endregion //region Filters diff --git a/docs/_posts/2019-07-14-watermarks-and-overlays.md b/docs/_posts/2019-07-14-watermarks-and-overlays.md index 22024ce6..da8d2ec9 100644 --- a/docs/_posts/2019-07-14-watermarks-and-overlays.md +++ b/docs/_posts/2019-07-14-watermarks-and-overlays.md @@ -44,16 +44,30 @@ overlay with `findViewById` and: - Change its position or appearance - Do so while video is being recorded - Any changes in the overlay appearance will be recorded in real-time in the picture snapshot - or video snapshot that you are capturing. +Any changes in the overlay appearance will be recorded in real-time in the picture snapshot +or video snapshot that you are capturing. + +As you can see in the example, you can also selectively choose, for each overlay, whether it +will draw on the preview (`layout_drawOnPreview`), on picture snapshots (`layout_drawOnPreview`), +on video snapshots (`layout_drawOnPreview`). - As you can see in the example, you can also selectively choose, for each overlay, whether it - will draw on the preview (`layout_drawOnPreview`), on picture snapshots (`layout_drawOnPreview`), - on video snapshots (`layout_drawOnPreview`). - ### Advanced Usage -If you need to change these flags at runtime, you should cast the overlay `LayoutParams` as follows: +To add an overlay at runtime, simply use `addView()`, but make sure you pass in an instance of +`OverlayLayout.LayoutParams`: + +```java +OverlayLayout.LayoutParams() params = new OverlayLayout.LayoutParams(); +cameraView.addView(overlay, params); +``` + +To remove an overlay at runtime, simply use `removeView()`: + +```java +cameraView.removeView(overlay); +``` + +To change the `layout_` flags at runtime, you should cast the overlay `LayoutParams` as follows: ```java // Cast to OverlayLayout.LayoutParams