Move gesture actions to enums

pull/1/head
Mattia Iavarone 7 years ago
parent 901cd782af
commit a531f8e5dd
  1. 12
      README.md
  2. 44
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
  3. 64
      cameraview/src/main/java/com/otaliastudios/cameraview/Gesture.java
  4. 62
      cameraview/src/main/options/com/otaliastudios/cameraview/Gesture.java
  5. 85
      cameraview/src/main/options/com/otaliastudios/cameraview/GestureAction.java

@ -15,7 +15,7 @@ compile 'com.otaliastudios:cameraview:1.0.0'
<img src="art/screen2.png" width="250" vspace="20" hspace="5"> <img src="art/screen2.png" width="250" vspace="20" hspace="5">
</p> </p>
*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 ### 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: `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 ```java
cameraView.mapGesture(Gesture.PINCH, CameraConstants.GESTURE_ACTION_ZOOM); // Pinch to zoom! cameraView.mapGesture(Gesture.PINCH, GestureAction.ZOOM); // Pinch to zoom!
cameraView.mapGesture(Gesture.TAP, CameraConstants.GESTURE_ACTION_FOCUS_WITH_MARKER); // Tap to focus! cameraView.mapGesture(Gesture.TAP, GestureAction.FOCUS_WITH_MARKER); // Tap to focus!
cameraView.mapGesture(Gesture.LONG_TAP, CameraConstants.GESTURE_ACTION_CAPTURE); // Long tap to shoot! 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: 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:cameraFlash="off"
app:cameraGrid="off" app:cameraGrid="off"
app:cameraSessionType="picture" app:cameraSessionType="picture"
app:cameraCropOutput="true" app:cameraCropOutput="false"
app:cameraJpegQuality="100" app:cameraJpegQuality="100"
app:cameraVideoQuality="480p" app:cameraVideoQuality="480p"
app:cameraWhiteBalance="auto" /> app:cameraWhiteBalance="auto" />
@ -392,7 +392,7 @@ Other APIs not mentioned above are provided, and are well documented and comment
|Method|Description| |Method|Description|
|------|-----------| |------|-----------|
|`isStarted()`|Returns true if `start()` was called succesfully. This does not mean that camera is open or showing preview.| |`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.| |`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.| |`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.| |`getExtraProperties()`|If camera was started, returns non-null object with extra information about the camera sensor. Not very useful at the moment.|

@ -81,7 +81,7 @@ public class CameraView extends FrameLayout {
private float mZoomValue; private float mZoomValue;
private float mExposureCorrectionValue; private float mExposureCorrectionValue;
private HashMap<Gesture, Integer> mGestureMap = new HashMap<>(4); private HashMap<Gesture, GestureAction> mGestureMap = new HashMap<>(4);
public CameraView(@NonNull Context context) { public CameraView(@NonNull Context context) {
super(context, null); super(context, null);
@ -104,10 +104,10 @@ public class CameraView extends FrameLayout {
int grid = a.getInteger(R.styleable.CameraView_cameraGrid, Defaults.DEFAULT_GRID); int grid = a.getInteger(R.styleable.CameraView_cameraGrid, Defaults.DEFAULT_GRID);
mJpegQuality = a.getInteger(R.styleable.CameraView_cameraJpegQuality, Defaults.DEFAULT_JPEG_QUALITY); mJpegQuality = a.getInteger(R.styleable.CameraView_cameraJpegQuality, Defaults.DEFAULT_JPEG_QUALITY);
mCropOutput = a.getBoolean(R.styleable.CameraView_cameraCropOutput, Defaults.DEFAULT_CROP_OUTPUT); 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 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); GestureAction longTapGesture = GestureAction.fromValue(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 pinchGesture = GestureAction.fromValue(a.getInteger(R.styleable.CameraView_cameraGesturePinch, Defaults.DEFAULT_GESTURE_ACTION_PINCH));
a.recycle(); a.recycle();
mCameraCallbacks = new CameraCallbacks(); mCameraCallbacks = new CameraCallbacks();
@ -326,24 +326,24 @@ public class CameraView extends FrameLayout {
* @param action which action should be assigned * @param action which action should be assigned
* @return true if this action could be assigned to this gesture * @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)) { if (gesture.isAssignableTo(action)) {
mGestureMap.put(gesture, action); mGestureMap.put(gesture, action);
switch (gesture) { switch (gesture) {
case PINCH: case PINCH:
mPinchGestureLayout.enable(mGestureMap.get(Gesture.PINCH) != GESTURE_ACTION_NONE); mPinchGestureLayout.enable(mGestureMap.get(Gesture.PINCH) != GestureAction.NONE);
break; break;
case TAP: case TAP:
// case DOUBLE_TAP: // case DOUBLE_TAP:
case LONG_TAP: case LONG_TAP:
mTapGestureLayout.enable(mGestureMap.get(Gesture.TAP) != GESTURE_ACTION_NONE || mTapGestureLayout.enable(mGestureMap.get(Gesture.TAP) != GestureAction.NONE ||
// mGestureMap.get(Gesture.DOUBLE_TAP) != GESTURE_ACTION_NONE || // mGestureMap.get(Gesture.DOUBLE_TAP) != GestureAction.NONE ||
mGestureMap.get(Gesture.LONG_TAP) != GESTURE_ACTION_NONE); mGestureMap.get(Gesture.LONG_TAP) != GestureAction.NONE);
break; break;
} }
return true; return true;
} }
mapGesture(gesture, GESTURE_ACTION_NONE); mapGesture(gesture, GestureAction.NONE);
return false; return false;
} }
@ -353,7 +353,7 @@ public class CameraView extends FrameLayout {
* @param gesture which gesture to clear * @param gesture which gesture to clear
*/ */
public void clearGesture(@NonNull Gesture gesture) { 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 CameraOptions options = mCameraController.getCameraOptions(); // Non null
if (mPinchGestureLayout.onTouchEvent(event)) { if (mPinchGestureLayout.onTouchEvent(event)) {
int action = mGestureMap.get(Gesture.PINCH); GestureAction action = mGestureMap.get(Gesture.PINCH);
// This currently can be zoom or AE. // This currently can be zoom or AE.
// Camera can either support these or not. // Camera can either support these or not.
if (action == GESTURE_ACTION_ZOOM) { if (action == GestureAction.ZOOM) {
float oldValue = mZoomValue; float oldValue = mZoomValue;
float newValue = mPinchGestureLayout.scaleValue(oldValue, 0, 1); float newValue = mPinchGestureLayout.scaleValue(oldValue, 0, 1);
PointF[] points = mPinchGestureLayout.getPoints(); PointF[] points = mPinchGestureLayout.getPoints();
@ -381,7 +381,7 @@ public class CameraView extends FrameLayout {
mCameraCallbacks.dispatchOnZoomChanged(newValue, points); mCameraCallbacks.dispatchOnZoomChanged(newValue, points);
} }
} else if (action == GESTURE_ACTION_AE_CORRECTION) { } else if (action == GestureAction.EXPOSURE_CORRECTION) {
float oldValue = mExposureCorrectionValue; float oldValue = mExposureCorrectionValue;
float minValue = options.getExposureCorrectionMinValue(); float minValue = options.getExposureCorrectionMinValue();
float maxValue = options.getExposureCorrectionMaxValue(); float maxValue = options.getExposureCorrectionMaxValue();
@ -396,14 +396,14 @@ public class CameraView extends FrameLayout {
} else if (mTapGestureLayout.onTouchEvent(event)) { } else if (mTapGestureLayout.onTouchEvent(event)) {
Gesture gesture = mTapGestureLayout.getGestureType(); Gesture gesture = mTapGestureLayout.getGestureType();
int action = mGestureMap.get(gesture); GestureAction action = mGestureMap.get(gesture);
// This currently can be capture, focus or focusWithMaker. // This currently can be capture, focus or focusWithMaker.
// Camera can either support these or not. // Camera can either support these or not.
if (action == GESTURE_ACTION_CAPTURE) { if (action == GestureAction.CAPTURE) {
capturePicture(); capturePicture();
} else if (action == GESTURE_ACTION_FOCUS || } else if (action == GestureAction.FOCUS ||
action == GESTURE_ACTION_FOCUS_WITH_MARKER) { action == GestureAction.FOCUS_WITH_MARKER) {
PointF point = mTapGestureLayout.getPoint(); PointF point = mTapGestureLayout.getPoint();
mCameraController.startAutoFocus(gesture, point); // This will call onFocusStart and onFocusEnd mCameraController.startAutoFocus(gesture, point); // This will call onFocusStart and onFocusEnd
} }
@ -1235,7 +1235,7 @@ public class CameraView extends FrameLayout {
uiHandler.post(new Runnable() { uiHandler.post(new Runnable() {
@Override @Override
public void run() { 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); mTapGestureLayout.onFocusStart(point);
} }
@ -1252,7 +1252,7 @@ public class CameraView extends FrameLayout {
uiHandler.post(new Runnable() { uiHandler.post(new Runnable() {
@Override @Override
public void run() { 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); mTapGestureLayout.onFocusEnd(success);
} }
@ -1357,7 +1357,7 @@ public class CameraView extends FrameLayout {
* @see CameraConstants#ZOOM_PINCH * @see CameraConstants#ZOOM_PINCH
* *
* @param zoom no-op * @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 @Deprecated
public void setZoomMode(@ZoomMode int zoom) { public void setZoomMode(@ZoomMode int zoom) {
@ -1367,7 +1367,7 @@ public class CameraView extends FrameLayout {
/** /**
* Gets the current zoom mode. * Gets the current zoom mode.
* @return no-op * @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 @ZoomMode
@Deprecated @Deprecated

@ -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<Integer> mControls;
boolean isAssignableTo(@GestureAction Integer control) {
return control == GESTURE_ACTION_NONE || mControls.contains(control);
}
}

@ -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<GestureAction> mControls;
boolean isAssignableTo(GestureAction control) {
return control == GestureAction.NONE || mControls.contains(control);
}
}

@ -1,14 +1,83 @@
package com.otaliastudios.cameraview; 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, * Auto focus control, typically assigned to the tap gesture.
GESTURE_ACTION_AE_CORRECTION, GESTURE_ACTION_CAPTURE, GESTURE_ACTION_ZOOM}) * This action can be mapped to:
public @interface GestureAction { *
* - {@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;
}
} }

Loading…
Cancel
Save