parent
dc31c40dd9
commit
8d3013ff53
@ -1,274 +0,0 @@ |
|||||||
package com.otaliastudios.cameraview.demo; |
|
||||||
|
|
||||||
import android.graphics.Color; |
|
||||||
import androidx.annotation.NonNull; |
|
||||||
import android.view.View; |
|
||||||
import android.view.ViewGroup; |
|
||||||
|
|
||||||
import com.otaliastudios.cameraview.CameraListener; |
|
||||||
import com.otaliastudios.cameraview.controls.Audio; |
|
||||||
import com.otaliastudios.cameraview.CameraOptions; |
|
||||||
import com.otaliastudios.cameraview.CameraView; |
|
||||||
import com.otaliastudios.cameraview.controls.Engine; |
|
||||||
import com.otaliastudios.cameraview.controls.Flash; |
|
||||||
import com.otaliastudios.cameraview.controls.Preview; |
|
||||||
import com.otaliastudios.cameraview.gesture.Gesture; |
|
||||||
import com.otaliastudios.cameraview.gesture.GestureAction; |
|
||||||
import com.otaliastudios.cameraview.controls.Grid; |
|
||||||
import com.otaliastudios.cameraview.controls.Hdr; |
|
||||||
import com.otaliastudios.cameraview.controls.Mode; |
|
||||||
import com.otaliastudios.cameraview.controls.VideoCodec; |
|
||||||
import com.otaliastudios.cameraview.controls.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 { |
|
||||||
|
|
||||||
// Layout
|
|
||||||
WIDTH("Width", false), |
|
||||||
HEIGHT("Height", true), |
|
||||||
|
|
||||||
// Some controls
|
|
||||||
MODE("Mode", false), |
|
||||||
FLASH("Flash", false), |
|
||||||
WHITE_BALANCE("White balance", false), |
|
||||||
HDR("Hdr", true), |
|
||||||
|
|
||||||
// Engine and preview
|
|
||||||
ENGINE("Engine", false), |
|
||||||
PREVIEW("Preview Surface", true), |
|
||||||
|
|
||||||
// Video recording
|
|
||||||
VIDEO_CODEC("Video codec", false), |
|
||||||
AUDIO("Audio", true), |
|
||||||
// TODO audio bitRate
|
|
||||||
// TODO video bitRate
|
|
||||||
// They are a bit annoying because it's not clear what the default should be.
|
|
||||||
|
|
||||||
// Gestures
|
|
||||||
PINCH("Pinch", false), |
|
||||||
HSCROLL("Horizontal scroll", false), |
|
||||||
VSCROLL("Vertical scroll", false), |
|
||||||
TAP("Single tap", false), |
|
||||||
LONG_TAP("Long tap", true), |
|
||||||
|
|
||||||
// Others
|
|
||||||
GRID("Grid lines", false), |
|
||||||
GRID_COLOR("Grid color", false), |
|
||||||
USE_DEVICE_ORIENTATION("Use device orientation", true); |
|
||||||
|
|
||||||
private String name; |
|
||||||
private boolean last; |
|
||||||
|
|
||||||
Control(String n, boolean l) { |
|
||||||
name = n; |
|
||||||
last = l; |
|
||||||
} |
|
||||||
|
|
||||||
public String getName() { |
|
||||||
return name; |
|
||||||
} |
|
||||||
|
|
||||||
public boolean isSectionLast() { |
|
||||||
return last; |
|
||||||
} |
|
||||||
|
|
||||||
public Collection<?> getValues(CameraView view, @NonNull CameraOptions options) { |
|
||||||
switch (this) { |
|
||||||
case WIDTH: |
|
||||||
case HEIGHT: |
|
||||||
View root = (View) view.getParent(); |
|
||||||
ArrayList<Integer> list = new ArrayList<>(); |
|
||||||
int boundary = this == WIDTH ? root.getWidth() : root.getHeight(); |
|
||||||
if (boundary == 0) boundary = 1000; |
|
||||||
int step = boundary / 10; |
|
||||||
// list.add(this == WIDTH ? 300 : 700);
|
|
||||||
list.add(ViewGroup.LayoutParams.WRAP_CONTENT); |
|
||||||
list.add(ViewGroup.LayoutParams.MATCH_PARENT); |
|
||||||
for (int i = step; i < boundary; i += step) { |
|
||||||
list.add(i); |
|
||||||
} |
|
||||||
return list; |
|
||||||
case MODE: return options.getSupportedControls(Mode.class); |
|
||||||
case FLASH: return options.getSupportedControls(Flash.class); |
|
||||||
case WHITE_BALANCE: return options.getSupportedControls(WhiteBalance.class); |
|
||||||
case HDR: return options.getSupportedControls(Hdr.class); |
|
||||||
case GRID: return options.getSupportedControls(Grid.class); |
|
||||||
case AUDIO: return options.getSupportedControls(Audio.class); |
|
||||||
case VIDEO_CODEC: return options.getSupportedControls(VideoCodec.class); |
|
||||||
case ENGINE: return options.getSupportedControls(Engine.class); |
|
||||||
case PREVIEW: return options.getSupportedControls(Preview.class); |
|
||||||
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.TAKE_PICTURE); |
|
||||||
addIfSupported(options, list2, GestureAction.AUTO_FOCUS); |
|
||||||
return list2; |
|
||||||
case GRID_COLOR: |
|
||||||
ArrayList<GridColor> list3 = new ArrayList<>(); |
|
||||||
list3.add(new GridColor(Color.argb(160, 255, 255, 255), "default")); |
|
||||||
list3.add(new GridColor(Color.WHITE, "white")); |
|
||||||
list3.add(new GridColor(Color.BLACK, "black")); |
|
||||||
list3.add(new GridColor(Color.YELLOW, "yellow")); |
|
||||||
return list3; |
|
||||||
case USE_DEVICE_ORIENTATION: |
|
||||||
return Arrays.asList(true, false); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
private void addIfSupported(CameraOptions options, List<GestureAction> list, GestureAction value) { |
|
||||||
if (options.supports(value)) list.add(value); |
|
||||||
} |
|
||||||
|
|
||||||
public Object getCurrentValue(CameraView view) { |
|
||||||
switch (this) { |
|
||||||
case WIDTH: return view.getLayoutParams().width; |
|
||||||
case HEIGHT: return view.getLayoutParams().height; |
|
||||||
case MODE: return view.getMode(); |
|
||||||
case FLASH: return view.getFlash(); |
|
||||||
case WHITE_BALANCE: return view.getWhiteBalance(); |
|
||||||
case GRID: return view.getGrid(); |
|
||||||
case GRID_COLOR: return new GridColor(view.getGridColor(), "color"); |
|
||||||
case AUDIO: return view.getAudio(); |
|
||||||
case VIDEO_CODEC: return view.getVideoCodec(); |
|
||||||
case HDR: return view.getHdr(); |
|
||||||
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); |
|
||||||
case USE_DEVICE_ORIENTATION: return view.getUseDeviceOrientation(); |
|
||||||
case ENGINE: return view.getEngine(); |
|
||||||
case PREVIEW: return view.getPreview(); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
public void applyValue(final CameraView camera, final 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 MODE: |
|
||||||
case FLASH: |
|
||||||
case WHITE_BALANCE: |
|
||||||
case GRID: |
|
||||||
case AUDIO: |
|
||||||
case VIDEO_CODEC: |
|
||||||
case HDR: |
|
||||||
camera.set((com.otaliastudios.cameraview.controls.Control) 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; |
|
||||||
case GRID_COLOR: |
|
||||||
camera.setGridColor(((GridColor) value).color); |
|
||||||
break; |
|
||||||
case USE_DEVICE_ORIENTATION: |
|
||||||
camera.setUseDeviceOrientation((Boolean) value); |
|
||||||
break; |
|
||||||
case ENGINE: |
|
||||||
boolean started = camera.isOpened(); |
|
||||||
if (started) { |
|
||||||
camera.addCameraListener(new CameraListener() { |
|
||||||
@Override |
|
||||||
public void onCameraClosed() { |
|
||||||
super.onCameraClosed(); |
|
||||||
camera.removeCameraListener(this); |
|
||||||
camera.setEngine((Engine) value); |
|
||||||
camera.open(); |
|
||||||
} |
|
||||||
}); |
|
||||||
camera.close(); |
|
||||||
} else { |
|
||||||
camera.setEngine((Engine) value); |
|
||||||
} |
|
||||||
break; |
|
||||||
case PREVIEW: |
|
||||||
boolean opened = camera.isOpened(); |
|
||||||
if (opened) { |
|
||||||
camera.addCameraListener(new CameraListener() { |
|
||||||
@Override |
|
||||||
public void onCameraClosed() { |
|
||||||
super.onCameraClosed(); |
|
||||||
camera.removeCameraListener(this); |
|
||||||
applyPreview(camera, (Preview) value, true); |
|
||||||
} |
|
||||||
}); |
|
||||||
camera.close(); |
|
||||||
} else { |
|
||||||
applyPreview(camera, (Preview) value, false); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// This is really tricky since the preview can only be changed when not attached to window.
|
|
||||||
private void applyPreview(@NonNull CameraView cameraView, @NonNull Preview newPreview, boolean openWhenDone) { |
|
||||||
ViewGroup.LayoutParams params = cameraView.getLayoutParams(); |
|
||||||
ViewGroup parent = (ViewGroup) cameraView.getParent(); |
|
||||||
int index = 0; |
|
||||||
for (int i = 0; i < parent.getChildCount(); i++) { |
|
||||||
if (parent.getChildAt(i) == cameraView) { |
|
||||||
index = i; |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
parent.removeView(cameraView); |
|
||||||
cameraView.setPreview(newPreview); |
|
||||||
parent.addView(cameraView, index, params); |
|
||||||
if (openWhenDone) cameraView.open(); |
|
||||||
} |
|
||||||
|
|
||||||
static class GridColor { |
|
||||||
int color; |
|
||||||
String name; |
|
||||||
|
|
||||||
GridColor(int color, String name) { |
|
||||||
this.color = color; |
|
||||||
this.name = name; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String toString() { |
|
||||||
return name; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean equals(Object obj) { |
|
||||||
return obj instanceof GridColor && color == ((GridColor) obj).color; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,444 @@ |
|||||||
|
package com.otaliastudios.cameraview.demo; |
||||||
|
|
||||||
|
import android.graphics.Color; |
||||||
|
import androidx.annotation.NonNull; |
||||||
|
import androidx.core.util.Pair; |
||||||
|
|
||||||
|
import android.view.View; |
||||||
|
import android.view.ViewGroup; |
||||||
|
|
||||||
|
import com.otaliastudios.cameraview.CameraListener; |
||||||
|
import com.otaliastudios.cameraview.CameraOptions; |
||||||
|
import com.otaliastudios.cameraview.CameraView; |
||||||
|
import com.otaliastudios.cameraview.gesture.Gesture; |
||||||
|
import com.otaliastudios.cameraview.gesture.GestureAction; |
||||||
|
|
||||||
|
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 abstract class Option<T> { |
||||||
|
|
||||||
|
public static List<Option<?>> getAll() { |
||||||
|
return Arrays.asList( |
||||||
|
// Layout
|
||||||
|
new Width(false), |
||||||
|
new Height(true), |
||||||
|
|
||||||
|
// Engine and preview
|
||||||
|
new Mode(false), |
||||||
|
new Engine(false), |
||||||
|
new Preview(true), |
||||||
|
|
||||||
|
// Some controls
|
||||||
|
new Flash(false), |
||||||
|
new WhiteBalance(false), |
||||||
|
new Hdr(true), |
||||||
|
|
||||||
|
// Video recording
|
||||||
|
new VideoCodec(false), |
||||||
|
new Audio(true), |
||||||
|
// TODO audio bitRate
|
||||||
|
// TODO video bitRate
|
||||||
|
// They are a bit annoying because it's not clear what the default should be.
|
||||||
|
|
||||||
|
// Gestures
|
||||||
|
new Pinch(false), |
||||||
|
new HorizontalScroll(false), |
||||||
|
new VerticalScroll(false), |
||||||
|
new Tap(false), |
||||||
|
new LongTap(true), |
||||||
|
|
||||||
|
// Other
|
||||||
|
new Grid(false), |
||||||
|
new GridColor(false), |
||||||
|
new UseDeviceOrientation(true) |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
private String name; |
||||||
|
private boolean hasDividerBelow; |
||||||
|
|
||||||
|
private Option(@NonNull String name, boolean hasDividerBelow) { |
||||||
|
this.name = name; |
||||||
|
this.hasDividerBelow = hasDividerBelow; |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("WeakerAccess") |
||||||
|
@NonNull |
||||||
|
public final String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("WeakerAccess") |
||||||
|
public final boolean hasDividerBelow() { |
||||||
|
return hasDividerBelow; |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
public abstract T get(@NonNull CameraView view); |
||||||
|
|
||||||
|
@NonNull |
||||||
|
public abstract Collection<T> getAll(@NonNull CameraView view, @NonNull CameraOptions options); |
||||||
|
|
||||||
|
public abstract void set(@NonNull CameraView view, @NonNull T value); |
||||||
|
|
||||||
|
@NonNull |
||||||
|
public String toString(@NonNull T value) { |
||||||
|
return String.valueOf(value).replace("_", " ").toLowerCase(); |
||||||
|
} |
||||||
|
|
||||||
|
public static class Width extends Option<Integer> { |
||||||
|
Width(boolean hasDividerBelow) { |
||||||
|
super("Width", hasDividerBelow); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Collection<Integer> getAll(@NonNull CameraView view, @NonNull CameraOptions options) { |
||||||
|
View root = (View) view.getParent(); |
||||||
|
ArrayList<Integer> list = new ArrayList<>(); |
||||||
|
int boundary = root.getWidth(); |
||||||
|
if (boundary == 0) boundary = 1000; |
||||||
|
int step = boundary / 10; |
||||||
|
list.add(ViewGroup.LayoutParams.WRAP_CONTENT); |
||||||
|
list.add(ViewGroup.LayoutParams.MATCH_PARENT); |
||||||
|
for (int i = step; i < boundary; i += step) { |
||||||
|
list.add(i); |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Integer get(@NonNull CameraView view) { |
||||||
|
return view.getLayoutParams().width; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void set(@NonNull CameraView view, @NonNull Integer value) { |
||||||
|
view.getLayoutParams().width = (int) value; |
||||||
|
view.setLayoutParams(view.getLayoutParams()); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public String toString(@NonNull Integer value) { |
||||||
|
if (value == ViewGroup.LayoutParams.MATCH_PARENT) return "match parent"; |
||||||
|
if (value == ViewGroup.LayoutParams.WRAP_CONTENT) return "wrap content"; |
||||||
|
return super.toString(value); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Height extends Option<Integer> { |
||||||
|
Height(boolean hasDividerBelow) { |
||||||
|
super("Height", hasDividerBelow); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Collection<Integer> getAll(@NonNull CameraView view, @NonNull CameraOptions options) { |
||||||
|
View root = (View) view.getParent(); |
||||||
|
ArrayList<Integer> list = new ArrayList<>(); |
||||||
|
int boundary = root.getHeight(); |
||||||
|
if (boundary == 0) boundary = 1000; |
||||||
|
int step = boundary / 10; |
||||||
|
list.add(ViewGroup.LayoutParams.WRAP_CONTENT); |
||||||
|
list.add(ViewGroup.LayoutParams.MATCH_PARENT); |
||||||
|
for (int i = step; i < boundary; i += step) { |
||||||
|
list.add(i); |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Integer get(@NonNull CameraView view) { |
||||||
|
return view.getLayoutParams().height; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void set(@NonNull CameraView view, @NonNull Integer value) { |
||||||
|
view.getLayoutParams().height = (int) value; |
||||||
|
view.setLayoutParams(view.getLayoutParams()); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public String toString(@NonNull Integer value) { |
||||||
|
if (value == ViewGroup.LayoutParams.MATCH_PARENT) return "match parent"; |
||||||
|
if (value == ViewGroup.LayoutParams.WRAP_CONTENT) return "wrap content"; |
||||||
|
return super.toString(value); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static abstract class ControlOption<T extends com.otaliastudios.cameraview.controls.Control> extends Option<T> { |
||||||
|
private final Class<T> controlClass; |
||||||
|
|
||||||
|
ControlOption(@NonNull Class<T> controlClass, String name, boolean hasDividerBelow) { |
||||||
|
super(name, hasDividerBelow); |
||||||
|
this.controlClass = controlClass; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void set(@NonNull CameraView view, @NonNull T value) { |
||||||
|
view.set(value); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public T get(@NonNull CameraView view) { |
||||||
|
return view.get(controlClass); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Collection<T> getAll(@NonNull CameraView view, @NonNull CameraOptions options) { |
||||||
|
return options.getSupportedControls(controlClass); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Mode extends ControlOption<com.otaliastudios.cameraview.controls.Mode> { |
||||||
|
Mode(boolean hasDividerBelow) { |
||||||
|
super(com.otaliastudios.cameraview.controls.Mode.class, "Mode", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Engine extends ControlOption<com.otaliastudios.cameraview.controls.Engine> { |
||||||
|
Engine(boolean hasDividerBelow) { |
||||||
|
super(com.otaliastudios.cameraview.controls.Engine.class, "Engine", hasDividerBelow); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void set(final @NonNull CameraView view, final @NonNull com.otaliastudios.cameraview.controls.Engine value) { |
||||||
|
boolean started = view.isOpened(); |
||||||
|
if (started) { |
||||||
|
view.addCameraListener(new CameraListener() { |
||||||
|
@Override |
||||||
|
public void onCameraClosed() { |
||||||
|
super.onCameraClosed(); |
||||||
|
view.removeCameraListener(this); |
||||||
|
view.setEngine(value); |
||||||
|
view.open(); |
||||||
|
} |
||||||
|
}); |
||||||
|
view.close(); |
||||||
|
} else { |
||||||
|
view.setEngine(value); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Preview extends ControlOption<com.otaliastudios.cameraview.controls.Preview> { |
||||||
|
Preview(boolean hasDividerBelow) { |
||||||
|
super(com.otaliastudios.cameraview.controls.Preview.class, "Preview Surface", hasDividerBelow); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void set(final @NonNull CameraView view, final @NonNull com.otaliastudios.cameraview.controls.Preview value) { |
||||||
|
boolean opened = view.isOpened(); |
||||||
|
if (opened) { |
||||||
|
view.addCameraListener(new CameraListener() { |
||||||
|
@Override |
||||||
|
public void onCameraClosed() { |
||||||
|
super.onCameraClosed(); |
||||||
|
view.removeCameraListener(this); |
||||||
|
applyPreview(view, value); |
||||||
|
view.open(); |
||||||
|
} |
||||||
|
}); |
||||||
|
view.close(); |
||||||
|
} else { |
||||||
|
applyPreview(view, value); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// This is really tricky since the preview can only be changed when not attached to window.
|
||||||
|
private void applyPreview(@NonNull CameraView cameraView, |
||||||
|
@NonNull com.otaliastudios.cameraview.controls.Preview newPreview) { |
||||||
|
ViewGroup.LayoutParams params = cameraView.getLayoutParams(); |
||||||
|
ViewGroup parent = (ViewGroup) cameraView.getParent(); |
||||||
|
int index = 0; |
||||||
|
for (int i = 0; i < parent.getChildCount(); i++) { |
||||||
|
if (parent.getChildAt(i) == cameraView) { |
||||||
|
index = i; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
parent.removeView(cameraView); |
||||||
|
cameraView.setPreview(newPreview); |
||||||
|
parent.addView(cameraView, index, params); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Flash extends ControlOption<com.otaliastudios.cameraview.controls.Flash> { |
||||||
|
Flash(boolean hasDividerBelow) { |
||||||
|
super(com.otaliastudios.cameraview.controls.Flash.class, "Flash", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class WhiteBalance extends ControlOption<com.otaliastudios.cameraview.controls.WhiteBalance> { |
||||||
|
WhiteBalance(boolean hasDividerBelow) { |
||||||
|
super(com.otaliastudios.cameraview.controls.WhiteBalance.class, "White Balance", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Hdr extends ControlOption<com.otaliastudios.cameraview.controls.Hdr> { |
||||||
|
Hdr(boolean hasDividerBelow) { |
||||||
|
super(com.otaliastudios.cameraview.controls.Hdr.class, "HDR", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class VideoCodec extends ControlOption<com.otaliastudios.cameraview.controls.VideoCodec> { |
||||||
|
VideoCodec(boolean hasDividerBelow) { |
||||||
|
super(com.otaliastudios.cameraview.controls.VideoCodec.class, "Video Codec", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Audio extends ControlOption<com.otaliastudios.cameraview.controls.Audio> { |
||||||
|
Audio(boolean hasDividerBelow) { |
||||||
|
super(com.otaliastudios.cameraview.controls.Audio.class, "Audio", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static abstract class GestureOption extends Option<GestureAction> { |
||||||
|
private final Gesture gesture; |
||||||
|
private final GestureAction[] allActions = GestureAction.values(); |
||||||
|
|
||||||
|
GestureOption(@NonNull Gesture gesture, String name, boolean hasDividerBelow) { |
||||||
|
super(name, hasDividerBelow); |
||||||
|
this.gesture = gesture; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void set(@NonNull CameraView view, @NonNull GestureAction value) { |
||||||
|
view.mapGesture(gesture, value); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public GestureAction get(@NonNull CameraView view) { |
||||||
|
return view.getGestureAction(gesture); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Collection<GestureAction> getAll(@NonNull CameraView view, @NonNull CameraOptions options) { |
||||||
|
List<GestureAction> list = new ArrayList<>(); |
||||||
|
for (GestureAction action : allActions) { |
||||||
|
if (gesture.isAssignableTo(action) && options.supports(action)) { |
||||||
|
list.add(action); |
||||||
|
} |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Pinch extends GestureOption { |
||||||
|
Pinch(boolean hasDividerBelow) { |
||||||
|
super(Gesture.PINCH, "Pinch", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class HorizontalScroll extends GestureOption { |
||||||
|
HorizontalScroll(boolean hasDividerBelow) { |
||||||
|
super(Gesture.SCROLL_HORIZONTAL, "Horizontal Scroll", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class VerticalScroll extends GestureOption { |
||||||
|
VerticalScroll(boolean hasDividerBelow) { |
||||||
|
super(Gesture.SCROLL_VERTICAL, "Vertical Scroll", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Tap extends GestureOption { |
||||||
|
Tap(boolean hasDividerBelow) { |
||||||
|
super(Gesture.TAP, "Tap", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class LongTap extends GestureOption { |
||||||
|
LongTap(boolean hasDividerBelow) { |
||||||
|
super(Gesture.LONG_TAP, "Long Tap", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Grid extends ControlOption<com.otaliastudios.cameraview.controls.Grid> { |
||||||
|
Grid(boolean hasDividerBelow) { |
||||||
|
super(com.otaliastudios.cameraview.controls.Grid.class, "Grid Lines", hasDividerBelow); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class GridColor extends Option<Pair<Integer, String>> { |
||||||
|
|
||||||
|
GridColor(boolean hasDividerBelow) { |
||||||
|
super("Grid Color", hasDividerBelow); |
||||||
|
} |
||||||
|
|
||||||
|
private static final List<Pair<Integer, String>> ALL = Arrays.asList( |
||||||
|
new Pair<>(Color.argb(160, 255, 255, 255), "default"), |
||||||
|
new Pair<>(Color.WHITE, "white"), |
||||||
|
new Pair<>(Color.BLACK, "black"), |
||||||
|
new Pair<>(Color.YELLOW, "yellow") |
||||||
|
); |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Collection<Pair<Integer, String>> getAll(@NonNull CameraView view, @NonNull CameraOptions options) { |
||||||
|
return ALL; |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Pair<Integer, String> get(@NonNull CameraView view) { |
||||||
|
for (Pair<Integer, String> pair : ALL) { |
||||||
|
//noinspection ConstantConditions
|
||||||
|
if (pair.first == view.getGridColor()) { |
||||||
|
return pair; |
||||||
|
} |
||||||
|
} |
||||||
|
throw new RuntimeException("Could not find grid color"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void set(@NonNull CameraView view, @NonNull Pair<Integer, String> value) { |
||||||
|
//noinspection ConstantConditions
|
||||||
|
view.setGridColor(value.first); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public String toString(@NonNull Pair<Integer, String> value) { |
||||||
|
//noinspection ConstantConditions
|
||||||
|
return value.second; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class UseDeviceOrientation extends Option<Boolean> { |
||||||
|
UseDeviceOrientation(boolean hasDividerBelow) { |
||||||
|
super("Use Device Orientation", hasDividerBelow); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Collection<Boolean> getAll(@NonNull CameraView view, @NonNull CameraOptions options) { |
||||||
|
return Arrays.asList(true, false); |
||||||
|
} |
||||||
|
|
||||||
|
@NonNull |
||||||
|
@Override |
||||||
|
public Boolean get(@NonNull CameraView view) { |
||||||
|
return view.getUseDeviceOrientation(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void set(@NonNull CameraView view, @NonNull Boolean value) { |
||||||
|
view.setUseDeviceOrientation(value); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue