Add gestures control

pull/53/head
Mattia Iavarone 8 years ago
parent 0667d87fae
commit 58b77a276a
  1. 34
      demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java
  2. 111
      demo/src/main/java/com/otaliastudios/cameraview/demo/Control.java
  3. 2
      demo/src/main/java/com/otaliastudios/cameraview/demo/ControlView.java
  4. 6
      demo/src/main/res/layout/control_view.xml

@ -96,12 +96,20 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis
message("Captured while taking video. Size="+mCaptureNativeSize, false); message("Captured while taking video. Size="+mCaptureNativeSize, false);
return; 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); PicturePreviewActivity.setImage(jpeg);
Intent intent = new Intent(CameraActivity.this, PicturePreviewActivity.class); Intent intent = new Intent(CameraActivity.this, PicturePreviewActivity.class);
intent.putExtra("delay", callbackTime - mCaptureTime); intent.putExtra("delay", callbackTime - mCaptureTime);
intent.putExtra("nativeWidth", mCaptureNativeSize.getWidth()); intent.putExtra("nativeWidth", mCaptureNativeSize.getWidth());
intent.putExtra("nativeHeight", mCaptureNativeSize.getHeight()); intent.putExtra("nativeHeight", mCaptureNativeSize.getHeight());
startActivity(intent); startActivity(intent);
mCaptureTime = 0;
mCaptureNativeSize = null;
} }
private void onVideo(File video) { private void onVideo(File video) {
@ -161,31 +169,7 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis
@Override @Override
public void onValueChanged(Control control, Object value, String name) { public void onValueChanged(Control control, Object value, String name) {
switch (control) { control.applyValue(camera, value);
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;
}
BottomSheetBehavior b = BottomSheetBehavior.from(controlPanel); BottomSheetBehavior b = BottomSheetBehavior.from(controlPanel);
b.setState(BottomSheetBehavior.STATE_HIDDEN); b.setState(BottomSheetBehavior.STATE_HIDDEN);
message("Changed " + control.getName() + " to " + name, false); message("Changed " + control.getName() + " to " + name, false);

@ -7,6 +7,8 @@ import com.otaliastudios.cameraview.Audio;
import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.CameraView; import com.otaliastudios.cameraview.CameraView;
import com.otaliastudios.cameraview.Flash; import com.otaliastudios.cameraview.Flash;
import com.otaliastudios.cameraview.Gesture;
import com.otaliastudios.cameraview.GestureAction;
import com.otaliastudios.cameraview.Grid; import com.otaliastudios.cameraview.Grid;
import com.otaliastudios.cameraview.SessionType; import com.otaliastudios.cameraview.SessionType;
import com.otaliastudios.cameraview.VideoQuality; import com.otaliastudios.cameraview.VideoQuality;
@ -15,36 +17,42 @@ import com.otaliastudios.cameraview.WhiteBalance;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List;
/** /**
* Controls that we want to display in a ControlView. * Controls that we want to display in a ControlView.
*/ */
public enum Control { public enum Control {
WIDTH("Width", Integer.class), WIDTH("Width", false),
HEIGHT("Height", Integer.class), HEIGHT("Height", true),
SESSION("Session type", SessionType.class), SESSION("Session type", false),
CROP_OUTPUT("Crop output", Boolean.class), CROP_OUTPUT("Crop output", true),
FLASH("Flash", Flash.class), FLASH("Flash", false),
WHITE_BALANCE("White balance", WhiteBalance.class), WHITE_BALANCE("White balance", false),
GRID("Grid", Grid.class), GRID("Grid", true),
VIDEO_QUALITY("Video quality", VideoQuality.class), VIDEO_QUALITY("Video quality", false),
AUDIO("Audio", Audio.class); 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 String name;
private Class<?> cla; private boolean last;
Control(String n, Class<?> cl) { Control(String n, boolean l) {
name = n; name = n;
cla = cl; last = l;
} }
public String getName() { public String getName() {
return name; return name;
} }
public Class<?> getType() { public boolean isSectionLast() {
return cla; return last;
} }
public Collection<?> getValues(CameraView view) { public Collection<?> getValues(CameraView view) {
@ -70,10 +78,31 @@ public enum Control {
case GRID: return Arrays.asList(Grid.values()); case GRID: return Arrays.asList(Grid.values());
case VIDEO_QUALITY: return Arrays.asList(VideoQuality.values()); case VIDEO_QUALITY: return Arrays.asList(VideoQuality.values());
case AUDIO: return Arrays.asList(Audio.values()); case AUDIO: return Arrays.asList(Audio.values());
case PINCH:
case HSCROLL:
case VSCROLL:
ArrayList<GestureAction> 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<GestureAction> 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; return null;
} }
private void addIfSupported(CameraOptions options, List<GestureAction> list, GestureAction value) {
if (options.supports(value)) list.add(value);
}
public Object getCurrentValue(CameraView view) { public Object getCurrentValue(CameraView view) {
switch (this) { switch (this) {
case WIDTH: return view.getLayoutParams().width; case WIDTH: return view.getLayoutParams().width;
@ -85,9 +114,63 @@ public enum Control {
case GRID: return view.getGrid(); case GRID: return view.getGrid();
case VIDEO_QUALITY: return view.getVideoQuality(); case VIDEO_QUALITY: return view.getVideoQuality();
case AUDIO: return view.getAudio(); 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; 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;
}
}
} }

@ -44,6 +44,8 @@ public class ControlView<Value> extends LinearLayout implements Spinner.OnItemSe
inflate(context, R.layout.control_view, this); inflate(context, R.layout.control_view, this);
TextView title = findViewById(R.id.title); TextView title = findViewById(R.id.title);
title.setText(control.getName()); title.setText(control.getName());
View divider = findViewById(R.id.divider);
divider.setVisibility(control.isSectionLast() ? View.VISIBLE : View.GONE);
ViewGroup content = findViewById(R.id.content); ViewGroup content = findViewById(R.id.content);
spinner = new Spinner(context, Spinner.MODE_DROPDOWN); spinner = new Spinner(context, Spinner.MODE_DROPDOWN);

@ -14,11 +14,15 @@
<FrameLayout <FrameLayout
android:id="@+id/content" android:id="@+id/content"
android:padding="8dp" android:paddingTop="4dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"/>
<View <View
android:id="@+id/divider"
android:layout_marginTop="8dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dp" android:layout_height="1dp"
android:background="#44AAAAAA" /> android:background="#44AAAAAA" />

Loading…
Cancel
Save