From 58b77a276a91343bc52f5faf3f4ee9597c392dbe Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Fri, 29 Sep 2017 02:19:52 +0200 Subject: [PATCH] Add gestures control --- .../cameraview/demo/CameraActivity.java | 34 ++---- .../cameraview/demo/Control.java | 111 +++++++++++++++--- .../cameraview/demo/ControlView.java | 2 + demo/src/main/res/layout/control_view.xml | 6 +- 4 files changed, 113 insertions(+), 40 deletions(-) diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java index a6da8bcf..7be67483 100644 --- a/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java +++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java @@ -96,12 +96,20 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis message("Captured while taking video. Size="+mCaptureNativeSize, false); return; } + + // This can happen if picture was taken with a gesture. + if (mCaptureTime == 0) mCaptureTime = callbackTime - 300; + if (mCaptureNativeSize == null) mCaptureNativeSize = camera.getCaptureSize(); + PicturePreviewActivity.setImage(jpeg); Intent intent = new Intent(CameraActivity.this, PicturePreviewActivity.class); intent.putExtra("delay", callbackTime - mCaptureTime); intent.putExtra("nativeWidth", mCaptureNativeSize.getWidth()); intent.putExtra("nativeHeight", mCaptureNativeSize.getHeight()); startActivity(intent); + + mCaptureTime = 0; + mCaptureNativeSize = null; } private void onVideo(File video) { @@ -161,31 +169,7 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis @Override public void onValueChanged(Control control, Object value, String name) { - switch (control) { - case WIDTH: - camera.getLayoutParams().width = (int) value; - camera.setLayoutParams(camera.getLayoutParams()); - break; - case HEIGHT: - camera.getLayoutParams().height = (int) value; - camera.setLayoutParams(camera.getLayoutParams()); - break; - case SESSION: - camera.setSessionType((SessionType) value); break; - case CROP_OUTPUT: - camera.setCropOutput((boolean) value); break; - case FLASH: - camera.setFlash((Flash) value); break; - case WHITE_BALANCE: - camera.setWhiteBalance((WhiteBalance) value); break; - case GRID: - camera.setGrid((Grid) value); break; - case VIDEO_QUALITY: - camera.setVideoQuality((VideoQuality) value); break; - case AUDIO: - camera.setAudio((Audio) value); break; - } - + control.applyValue(camera, value); BottomSheetBehavior b = BottomSheetBehavior.from(controlPanel); b.setState(BottomSheetBehavior.STATE_HIDDEN); message("Changed " + control.getName() + " to " + name, false); diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/Control.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/Control.java index 13e328ca..74fbccb3 100644 --- a/demo/src/main/java/com/otaliastudios/cameraview/demo/Control.java +++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/Control.java @@ -7,6 +7,8 @@ import com.otaliastudios.cameraview.Audio; import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraView; import com.otaliastudios.cameraview.Flash; +import com.otaliastudios.cameraview.Gesture; +import com.otaliastudios.cameraview.GestureAction; import com.otaliastudios.cameraview.Grid; import com.otaliastudios.cameraview.SessionType; import com.otaliastudios.cameraview.VideoQuality; @@ -15,36 +17,42 @@ import com.otaliastudios.cameraview.WhiteBalance; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; /** * Controls that we want to display in a ControlView. */ public enum Control { - WIDTH("Width", Integer.class), - HEIGHT("Height", Integer.class), - SESSION("Session type", SessionType.class), - CROP_OUTPUT("Crop output", Boolean.class), - FLASH("Flash", Flash.class), - WHITE_BALANCE("White balance", WhiteBalance.class), - GRID("Grid", Grid.class), - VIDEO_QUALITY("Video quality", VideoQuality.class), - AUDIO("Audio", Audio.class); + WIDTH("Width", false), + HEIGHT("Height", true), + SESSION("Session type", false), + CROP_OUTPUT("Crop output", true), + FLASH("Flash", false), + WHITE_BALANCE("White balance", false), + GRID("Grid", true), + VIDEO_QUALITY("Video quality", false), + AUDIO("Audio", true), + PINCH("Pinch gesture", false), + HSCROLL("Horizontal scroll gesture", false), + VSCROLL("Vertical scroll gesture", false), + TAP("Single tap gesture", false), + LONG_TAP("Long tap gesture", true); private String name; - private Class cla; + private boolean last; - Control(String n, Class cl) { + Control(String n, boolean l) { name = n; - cla = cl; + last = l; } public String getName() { return name; } - public Class getType() { - return cla; + public boolean isSectionLast() { + return last; } public Collection getValues(CameraView view) { @@ -70,10 +78,31 @@ public enum Control { case GRID: return Arrays.asList(Grid.values()); case VIDEO_QUALITY: return Arrays.asList(VideoQuality.values()); case AUDIO: return Arrays.asList(Audio.values()); + case PINCH: + case HSCROLL: + case VSCROLL: + ArrayList list1 = new ArrayList<>(); + addIfSupported(options, list1, GestureAction.NONE); + addIfSupported(options, list1, GestureAction.ZOOM); + addIfSupported(options, list1, GestureAction.EXPOSURE_CORRECTION); + return list1; + case TAP: + case LONG_TAP: + ArrayList list2 = new ArrayList<>(); + addIfSupported(options, list2, GestureAction.NONE); + addIfSupported(options, list2, GestureAction.CAPTURE); + addIfSupported(options, list2, GestureAction.FOCUS); + addIfSupported(options, list2, GestureAction.FOCUS_WITH_MARKER); + return list2; + } return null; } + private void addIfSupported(CameraOptions options, List list, GestureAction value) { + if (options.supports(value)) list.add(value); + } + public Object getCurrentValue(CameraView view) { switch (this) { case WIDTH: return view.getLayoutParams().width; @@ -85,9 +114,63 @@ public enum Control { case GRID: return view.getGrid(); case VIDEO_QUALITY: return view.getVideoQuality(); case AUDIO: return view.getAudio(); + case PINCH: return view.getGestureAction(Gesture.PINCH); + case HSCROLL: return view.getGestureAction(Gesture.SCROLL_HORIZONTAL); + case VSCROLL: return view.getGestureAction(Gesture.SCROLL_VERTICAL); + case TAP: return view.getGestureAction(Gesture.TAP); + case LONG_TAP: return view.getGestureAction(Gesture.LONG_TAP); } return null; } + public void applyValue(CameraView camera, Object value) { + switch (this) { + case WIDTH: + camera.getLayoutParams().width = (int) value; + camera.setLayoutParams(camera.getLayoutParams()); + break; + case HEIGHT: + camera.getLayoutParams().height = (int) value; + camera.setLayoutParams(camera.getLayoutParams()); + break; + case SESSION: + camera.setSessionType((SessionType) value); + break; + case CROP_OUTPUT: + camera.setCropOutput((boolean) value); + break; + case FLASH: + camera.setFlash((Flash) value); + break; + case WHITE_BALANCE: + camera.setWhiteBalance((WhiteBalance) value); + break; + case GRID: + camera.setGrid((Grid) value); + break; + case VIDEO_QUALITY: + camera.setVideoQuality((VideoQuality) value); + break; + case AUDIO: + camera.setAudio((Audio) value); + break; + case PINCH: + camera.mapGesture(Gesture.PINCH, (GestureAction) value); + break; + case HSCROLL: + camera.mapGesture(Gesture.SCROLL_HORIZONTAL, (GestureAction) value); + break; + case VSCROLL: + camera.mapGesture(Gesture.SCROLL_VERTICAL, (GestureAction) value); + break; + case TAP: + camera.mapGesture(Gesture.TAP, (GestureAction) value); + break; + case LONG_TAP: + camera.mapGesture(Gesture.LONG_TAP, (GestureAction) value); + break; + } + } + } diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/ControlView.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/ControlView.java index 05c34436..bab55baa 100644 --- a/demo/src/main/java/com/otaliastudios/cameraview/demo/ControlView.java +++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/ControlView.java @@ -44,6 +44,8 @@ public class ControlView extends LinearLayout implements Spinner.OnItemSe inflate(context, R.layout.control_view, this); TextView title = findViewById(R.id.title); title.setText(control.getName()); + View divider = findViewById(R.id.divider); + divider.setVisibility(control.isSectionLast() ? View.VISIBLE : View.GONE); ViewGroup content = findViewById(R.id.content); spinner = new Spinner(context, Spinner.MODE_DROPDOWN); diff --git a/demo/src/main/res/layout/control_view.xml b/demo/src/main/res/layout/control_view.xml index 0839eda3..b3f12f4f 100644 --- a/demo/src/main/res/layout/control_view.xml +++ b/demo/src/main/res/layout/control_view.xml @@ -14,11 +14,15 @@