diff --git a/README.md b/README.md index 3b406ada..38cc7e46 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ compile 'com.otaliastudios:cameraview:1.0.0'

-*This is a fork of [CameraKit-Android library](https://github.com/gogopop/CameraKit-Android), originally a fork of [Google's CameraView library](https://github.com/google/cameraview). The library at this point has been completely rewritten and refactored. See [below](#roadmap) for a list of what was done. This works better than any other library I have tried, and I would be grateful for any issue, suggestion or contribution.* +*This is a fork of [CameraKit-Android library](https://github.com/gogopop/CameraKit-Android), originally a fork of [Google's CameraView library](https://github.com/google/cameraview), but has been completely rewritten. See [below](#roadmap) for a list of what was done. Feel free to contribute - this is under active development.* ### Features @@ -217,9 +217,9 @@ camera.addCameraListener(new CameraListener() { `CameraView` listen to lots of different gestures inside its bounds. You have the chance to map these gestures to particular actions or camera controls, using `mapGesture()`. This lets you emulate typical behaviors in a single line: ```java -cameraView.mapGesture(Gesture.PINCH, CameraConstants.GESTURE_ACTION_ZOOM); // Pinch to zoom! -cameraView.mapGesture(Gesture.TAP, CameraConstants.GESTURE_ACTION_FOCUS_WITH_MARKER); // Tap to focus! -cameraView.mapGesture(Gesture.LONG_TAP, CameraConstants.GESTURE_ACTION_CAPTURE); // Long tap to shoot! +cameraView.mapGesture(Gesture.PINCH, GestureAction.ZOOM); // Pinch to zoom! +cameraView.mapGesture(Gesture.TAP, GestureAction.FOCUS_WITH_MARKER); // Tap to focus! +cameraView.mapGesture(Gesture.LONG_TAP, GestureAction.CAPTURE); // Long tap to shoot! ``` Simple as that. More gestures are coming. There are two things to be noted: @@ -283,7 +283,7 @@ Most camera parameters can be controlled through XML attributes or linked method app:cameraFlash="off" app:cameraGrid="off" app:cameraSessionType="picture" - app:cameraCropOutput="true" + app:cameraCropOutput="false" app:cameraJpegQuality="100" app:cameraVideoQuality="480p" app:cameraWhiteBalance="auto" /> @@ -392,7 +392,7 @@ Other APIs not mentioned above are provided, and are well documented and comment |Method|Description| |------|-----------| |`isStarted()`|Returns true if `start()` was called succesfully. This does not mean that camera is open or showing preview.| -|`mapGesture(Gesture, int)`|Maps a certain gesture to a certain action. No-op if the action is not supported.| +|`mapGesture(Gesture, GestureAction)`|Maps a certain gesture to a certain action. No-op if the action is not supported.| |`clearGesture(Gesture)`|Clears any action mapped to the given gesture.| |`getCameraOptions()`|If camera was started, returns non-null object with information about what is supported.| |`getExtraProperties()`|If camera was started, returns non-null object with extra information about the camera sensor. Not very useful at the moment.| diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index f3948c1d..29137540 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -81,7 +81,7 @@ public class CameraView extends FrameLayout { private float mZoomValue; private float mExposureCorrectionValue; - private HashMap mGestureMap = new HashMap<>(4); + private HashMap mGestureMap = new HashMap<>(4); public CameraView(@NonNull Context context) { super(context, null); @@ -104,10 +104,10 @@ public class CameraView extends FrameLayout { int grid = a.getInteger(R.styleable.CameraView_cameraGrid, Defaults.DEFAULT_GRID); mJpegQuality = a.getInteger(R.styleable.CameraView_cameraJpegQuality, Defaults.DEFAULT_JPEG_QUALITY); mCropOutput = a.getBoolean(R.styleable.CameraView_cameraCropOutput, Defaults.DEFAULT_CROP_OUTPUT); - int tapGesture = a.getInteger(R.styleable.CameraView_cameraGestureTap, Defaults.DEFAULT_GESTURE_ACTION_TAP); + GestureAction tapGesture = GestureAction.fromValue(a.getInteger(R.styleable.CameraView_cameraGestureTap, Defaults.DEFAULT_GESTURE_ACTION_TAP)); // int doubleTapGesture = a.getInteger(R.styleable.CameraView_cameraGestureDoubleTap, Defaults.DEFAULT_GESTURE_ACTION_DOUBLE_TAP); - int longTapGesture = a.getInteger(R.styleable.CameraView_cameraGestureLongTap, Defaults.DEFAULT_GESTURE_ACTION_LONG_TAP); - int pinchGesture = a.getInteger(R.styleable.CameraView_cameraGesturePinch, Defaults.DEFAULT_GESTURE_ACTION_PINCH); + GestureAction longTapGesture = GestureAction.fromValue(a.getInteger(R.styleable.CameraView_cameraGestureLongTap, Defaults.DEFAULT_GESTURE_ACTION_LONG_TAP)); + GestureAction pinchGesture = GestureAction.fromValue(a.getInteger(R.styleable.CameraView_cameraGesturePinch, Defaults.DEFAULT_GESTURE_ACTION_PINCH)); a.recycle(); mCameraCallbacks = new CameraCallbacks(); @@ -326,24 +326,24 @@ public class CameraView extends FrameLayout { * @param action which action should be assigned * @return true if this action could be assigned to this gesture */ - public boolean mapGesture(@NonNull Gesture gesture, @GestureAction int action) { + public boolean mapGesture(@NonNull Gesture gesture, GestureAction action) { if (gesture.isAssignableTo(action)) { mGestureMap.put(gesture, action); switch (gesture) { case PINCH: - mPinchGestureLayout.enable(mGestureMap.get(Gesture.PINCH) != GESTURE_ACTION_NONE); + mPinchGestureLayout.enable(mGestureMap.get(Gesture.PINCH) != GestureAction.NONE); break; case TAP: // case DOUBLE_TAP: case LONG_TAP: - mTapGestureLayout.enable(mGestureMap.get(Gesture.TAP) != GESTURE_ACTION_NONE || - // mGestureMap.get(Gesture.DOUBLE_TAP) != GESTURE_ACTION_NONE || - mGestureMap.get(Gesture.LONG_TAP) != GESTURE_ACTION_NONE); + mTapGestureLayout.enable(mGestureMap.get(Gesture.TAP) != GestureAction.NONE || + // mGestureMap.get(Gesture.DOUBLE_TAP) != GestureAction.NONE || + mGestureMap.get(Gesture.LONG_TAP) != GestureAction.NONE); break; } return true; } - mapGesture(gesture, GESTURE_ACTION_NONE); + mapGesture(gesture, GestureAction.NONE); return false; } @@ -353,7 +353,7 @@ public class CameraView extends FrameLayout { * @param gesture which gesture to clear */ public void clearGesture(@NonNull Gesture gesture) { - mGestureMap.put(gesture, GESTURE_ACTION_NONE); + mGestureMap.put(gesture, GestureAction.NONE); } @@ -369,10 +369,10 @@ public class CameraView extends FrameLayout { CameraOptions options = mCameraController.getCameraOptions(); // Non null if (mPinchGestureLayout.onTouchEvent(event)) { - int action = mGestureMap.get(Gesture.PINCH); + GestureAction action = mGestureMap.get(Gesture.PINCH); // This currently can be zoom or AE. // Camera can either support these or not. - if (action == GESTURE_ACTION_ZOOM) { + if (action == GestureAction.ZOOM) { float oldValue = mZoomValue; float newValue = mPinchGestureLayout.scaleValue(oldValue, 0, 1); PointF[] points = mPinchGestureLayout.getPoints(); @@ -381,7 +381,7 @@ public class CameraView extends FrameLayout { mCameraCallbacks.dispatchOnZoomChanged(newValue, points); } - } else if (action == GESTURE_ACTION_AE_CORRECTION) { + } else if (action == GestureAction.EXPOSURE_CORRECTION) { float oldValue = mExposureCorrectionValue; float minValue = options.getExposureCorrectionMinValue(); float maxValue = options.getExposureCorrectionMaxValue(); @@ -396,14 +396,14 @@ public class CameraView extends FrameLayout { } else if (mTapGestureLayout.onTouchEvent(event)) { Gesture gesture = mTapGestureLayout.getGestureType(); - int action = mGestureMap.get(gesture); + GestureAction action = mGestureMap.get(gesture); // This currently can be capture, focus or focusWithMaker. // Camera can either support these or not. - if (action == GESTURE_ACTION_CAPTURE) { + if (action == GestureAction.CAPTURE) { capturePicture(); - } else if (action == GESTURE_ACTION_FOCUS || - action == GESTURE_ACTION_FOCUS_WITH_MARKER) { + } else if (action == GestureAction.FOCUS || + action == GestureAction.FOCUS_WITH_MARKER) { PointF point = mTapGestureLayout.getPoint(); mCameraController.startAutoFocus(gesture, point); // This will call onFocusStart and onFocusEnd } @@ -1235,7 +1235,7 @@ public class CameraView extends FrameLayout { uiHandler.post(new Runnable() { @Override public void run() { - if (gesture != null && mGestureMap.get(gesture) == GESTURE_ACTION_FOCUS_WITH_MARKER) { + if (gesture != null && mGestureMap.get(gesture) == GestureAction.FOCUS_WITH_MARKER) { mTapGestureLayout.onFocusStart(point); } @@ -1252,7 +1252,7 @@ public class CameraView extends FrameLayout { uiHandler.post(new Runnable() { @Override public void run() { - if (gesture != null && mGestureMap.get(gesture) == GESTURE_ACTION_FOCUS_WITH_MARKER) { + if (gesture != null && mGestureMap.get(gesture) == GestureAction.FOCUS_WITH_MARKER) { mTapGestureLayout.onFocusEnd(success); } @@ -1357,7 +1357,7 @@ public class CameraView extends FrameLayout { * @see CameraConstants#ZOOM_PINCH * * @param zoom no-op - * @deprecated use {@link #mapGesture(Gesture, int)} to map zoom control to gestures + * @deprecated use {@link #mapGesture(Gesture, GestureAction)} to map zoom control to gestures */ @Deprecated public void setZoomMode(@ZoomMode int zoom) { @@ -1367,7 +1367,7 @@ public class CameraView extends FrameLayout { /** * Gets the current zoom mode. * @return no-op - * @deprecated use {@link #mapGesture(Gesture, int)} to map zoom control to gestures + * @deprecated use {@link #mapGesture(Gesture, GestureAction)} to map zoom control to gestures */ @ZoomMode @Deprecated diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/Gesture.java b/cameraview/src/main/java/com/otaliastudios/cameraview/Gesture.java deleted file mode 100644 index d4d91d39..00000000 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/Gesture.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.otaliastudios.cameraview; - - -import java.util.Arrays; -import java.util.List; - -import static com.otaliastudios.cameraview.CameraConstants.*; - - -/** - * Gestures listen to finger gestures over the {@link CameraView} bounds and can be mapped - * to one or more camera controls using XML attributes or {@link CameraView#mapGesture(Gesture, int)}. - * - * Not every gesture can control a certain action. For example, pinch gestures can only control - * continuous values, such as zoom or AE correction. Single point gestures, on the other hand, - * can only control point actions such as focusing or capturing a picture. - */ -public enum Gesture { - - /** - * Pinch gesture, typically assigned to the zoom control. - * This gesture can be mapped to: - * - * - {@link CameraConstants#GESTURE_ACTION_ZOOM} - * - {@link CameraConstants#GESTURE_ACTION_AE_CORRECTION} - * - {@link CameraConstants#GESTURE_ACTION_NONE} - */ - PINCH(GESTURE_ACTION_ZOOM, GESTURE_ACTION_AE_CORRECTION), - - /** - * Single tap gesture, typically assigned to the focus control. - * This gesture can be mapped to: - * - * - {@link CameraConstants#GESTURE_ACTION_FOCUS} - * - {@link CameraConstants#GESTURE_ACTION_FOCUS_WITH_MARKER} - * - {@link CameraConstants#GESTURE_ACTION_CAPTURE} - * - {@link CameraConstants#GESTURE_ACTION_NONE} - */ - TAP(GESTURE_ACTION_FOCUS, GESTURE_ACTION_FOCUS_WITH_MARKER, GESTURE_ACTION_CAPTURE), - // DOUBLE_TAP(GESTURE_ACTION_FOCUS, GESTURE_ACTION_FOCUS_WITH_MARKER, GESTURE_ACTION_CAPTURE), - - /** - * Long tap gesture. - * This gesture can be mapped to: - * - * - {@link CameraConstants#GESTURE_ACTION_FOCUS} - * - {@link CameraConstants#GESTURE_ACTION_FOCUS_WITH_MARKER} - * - {@link CameraConstants#GESTURE_ACTION_CAPTURE} - * - {@link CameraConstants#GESTURE_ACTION_NONE} - */ - LONG_TAP(GESTURE_ACTION_FOCUS, GESTURE_ACTION_FOCUS_WITH_MARKER, GESTURE_ACTION_CAPTURE); - - - Gesture(@GestureAction Integer... controls) { - mControls = Arrays.asList(controls); - } - - private List mControls; - - boolean isAssignableTo(@GestureAction Integer control) { - return control == GESTURE_ACTION_NONE || mControls.contains(control); - } - -} diff --git a/cameraview/src/main/options/com/otaliastudios/cameraview/Gesture.java b/cameraview/src/main/options/com/otaliastudios/cameraview/Gesture.java new file mode 100644 index 00000000..45f1c2be --- /dev/null +++ b/cameraview/src/main/options/com/otaliastudios/cameraview/Gesture.java @@ -0,0 +1,62 @@ +package com.otaliastudios.cameraview; + + +import java.util.Arrays; +import java.util.List; + + +/** + * Gestures listen to finger gestures over the {@link CameraView} bounds and can be mapped + * to one or more camera controls using XML attributes or {@link CameraView#mapGesture(Gesture, GestureAction)}. + * + * Not every gesture can control a certain action. For example, pinch gestures can only control + * continuous values, such as zoom or AE correction. Single point gestures, on the other hand, + * can only control point actions such as focusing or capturing a picture. + */ +public enum Gesture { + + /** + * Pinch gesture, typically assigned to the zoom control. + * This gesture can be mapped to: + * + * - {@link GestureAction#ZOOM} + * - {@link GestureAction#EXPOSURE_CORRECTION} + * - {@link GestureAction#NONE} + */ + PINCH(GestureAction.ZOOM, GestureAction.EXPOSURE_CORRECTION), + + /** + * Single tap gesture, typically assigned to the focus control. + * This gesture can be mapped to: + * + * - {@link GestureAction#FOCUS} + * - {@link GestureAction#FOCUS_WITH_MARKER} + * - {@link GestureAction#CAPTURE} + * - {@link GestureAction#NONE} + */ + TAP(GestureAction.FOCUS, GestureAction.FOCUS_WITH_MARKER, GestureAction.CAPTURE), + // DOUBLE_TAP(GestureAction.FOCUS, GestureAction.FOCUS_WITH_MARKER, GestureAction.CAPTURE), + + /** + * Long tap gesture. + * This gesture can be mapped to: + * + * - {@link GestureAction#FOCUS} + * - {@link GestureAction#FOCUS_WITH_MARKER} + * - {@link GestureAction#CAPTURE} + * - {@link GestureAction#NONE} + */ + LONG_TAP(GestureAction.FOCUS, GestureAction.FOCUS_WITH_MARKER, GestureAction.CAPTURE); + + + Gesture(GestureAction... controls) { + mControls = Arrays.asList(controls); + } + + private List mControls; + + boolean isAssignableTo(GestureAction control) { + return control == GestureAction.NONE || mControls.contains(control); + } + +} diff --git a/cameraview/src/main/options/com/otaliastudios/cameraview/GestureAction.java b/cameraview/src/main/options/com/otaliastudios/cameraview/GestureAction.java index e615c042..c61b5592 100644 --- a/cameraview/src/main/options/com/otaliastudios/cameraview/GestureAction.java +++ b/cameraview/src/main/options/com/otaliastudios/cameraview/GestureAction.java @@ -1,14 +1,83 @@ package com.otaliastudios.cameraview; -import android.support.annotation.IntDef; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; +/** + * Gestures actions are actions over camera controls that can be mapped to certain gestures over + * the screen, using XML attributes or {@link CameraView#mapGesture(Gesture, GestureAction)}. + * + * Not every gesture can control a certain action. For example, pinch gestures can only control + * continuous values, such as zoom or AE correction. Single point gestures, on the other hand, + * can only control point actions such as focusing or capturing a picture. + */ +public enum GestureAction { -import static com.otaliastudios.cameraview.CameraConstants.*; + /** + * No action. This can be mapped to any gesture to disable it. + */ + NONE(0), -@Retention(RetentionPolicy.SOURCE) -@IntDef({GESTURE_ACTION_NONE, GESTURE_ACTION_FOCUS, GESTURE_ACTION_FOCUS_WITH_MARKER, - GESTURE_ACTION_AE_CORRECTION, GESTURE_ACTION_CAPTURE, GESTURE_ACTION_ZOOM}) -public @interface GestureAction { + /** + * Auto focus control, typically assigned to the tap gesture. + * This action can be mapped to: + * + * - {@link Gesture#TAP} + * - {@link Gesture#LONG_TAP} + */ + FOCUS(1), + + /** + * Auto focus control, typically assigned to the tap gesture. + * On top of {@link #FOCUS}, this will draw a default marker on screen. + * This action can be mapped to: + * + * - {@link Gesture#TAP} + * - {@link Gesture#LONG_TAP} + */ + FOCUS_WITH_MARKER(2), + + /** + * When triggered, this action will fire a picture shoot. + * This action can be mapped to: + * + * - {@link Gesture#TAP} + * - {@link Gesture#LONG_TAP} + */ + CAPTURE(3), + + /** + * Zoom control, typically assigned to the pinch gesture. + * This action can be mapped to: + * + * - {@link Gesture#PINCH} + */ + ZOOM(4), + + /** + * Exposure correction control. + * This action can be mapped to: + * + * - {@link Gesture#PINCH} + */ + EXPOSURE_CORRECTION(5); + + + private int value; + + GestureAction(int value) { + this.value = value; + } + + private int value() { + return value; + } + + static GestureAction fromValue(int value) { + GestureAction[] list = GestureAction.values(); + for (GestureAction action : list) { + if (action.value() == value) { + return action; + } + } + return null; + } }