XML support, require experimental flag

pull/535/head
Mattia Iavarone 6 years ago
parent 3e57e10f89
commit 8e8dea9ddd
  1. 16
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
  2. 33
      cameraview/src/main/java/com/otaliastudios/cameraview/filter/FilterParser.java
  3. 2
      cameraview/src/main/res/values/attrs.xml

@ -48,6 +48,7 @@ import com.otaliastudios.cameraview.engine.Camera2Engine;
import com.otaliastudios.cameraview.engine.CameraEngine;
import com.otaliastudios.cameraview.engine.offset.Reference;
import com.otaliastudios.cameraview.filter.Filter;
import com.otaliastudios.cameraview.filter.FilterParser;
import com.otaliastudios.cameraview.filter.Filters;
import com.otaliastudios.cameraview.filter.NoFilter;
import com.otaliastudios.cameraview.frame.Frame;
@ -111,6 +112,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
private HashMap<Gesture, GestureAction> mGestureMap = new HashMap<>(4);
private Preview mPreview;
private Engine mEngine;
private Filter mPendingFilter;
// Components
@VisibleForTesting CameraCallbacks mCameraCallbacks;
@ -179,6 +181,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
SizeSelectorParser sizeSelectors = new SizeSelectorParser(a);
GestureParser gestures = new GestureParser(a);
MarkerParser markers = new MarkerParser(a);
FilterParser filters = new FilterParser(a);
a.recycle();
@ -236,6 +239,9 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
// Apply markers
setAutoFocusMarker(markers.getAutoFocusMarker());
// Apply filters
setFilter(filters.getFilter());
if (!isInEditMode()) {
mOrientationHelper = new OrientationHelper(context, mCameraCallbacks);
}
@ -263,6 +269,10 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
mCameraPreview = instantiatePreview(mPreview, getContext(), this);
LOG.w("doInstantiateEngine:", "instantiated. preview:", mCameraPreview.getClass().getSimpleName());
mCameraEngine.setPreview(mCameraPreview);
if (mPendingFilter != null) {
setFilter(mPendingFilter);
mPendingFilter = null;
}
}
@ -2151,7 +2161,11 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
* @param filter a new filter
*/
public void setFilter(@NonNull Filter filter) {
if (mCameraPreview instanceof FilterCameraPreview) {
if (mCameraPreview == null) {
mPendingFilter = filter;
} else if (!(filter instanceof NoFilter) && !mExperimental) {
LOG.w("Filters are an experimental features and need the experimental flag set.");
} else if (mCameraPreview instanceof FilterCameraPreview) {
((FilterCameraPreview) mCameraPreview).setFilter(filter);
} else {
LOG.w("setFilter() is supported only for GL_SURFACE. Preview:", mPreview);

@ -0,0 +1,33 @@
package com.otaliastudios.cameraview.filter;
import android.content.res.TypedArray;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.otaliastudios.cameraview.R;
/**
* Parses filters from XML attributes.
*/
public class FilterParser {
private Filter filter = null;
public FilterParser(@NonNull TypedArray array) {
String filterName = array.getString(R.styleable.CameraView_cameraFilter);
if (filterName != null) {
try {
Class<?> filterClass = Class.forName(filterName);
filter = (Filter) filterClass.newInstance();
} catch (Exception ignore) {
filter = new NoFilter();
}
}
}
@NonNull
public Filter getFilter() {
return filter;
}
}

@ -131,6 +131,8 @@
<attr name="cameraAutoFocusMarker" format="string|reference"/>
<attr name="cameraFilter" format="string|reference"/>
<attr name="cameraUseDeviceOrientation" format="boolean"/>
<attr name="cameraExperimental" format="boolean" />

Loading…
Cancel
Save