Avoid redundant requestLayout

pull/696/head
Mattia Iavarone 6 years ago
parent 28b869f680
commit d12dba9609
  1. 27
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java

@ -125,6 +125,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
private CameraPreview mCameraPreview; private CameraPreview mCameraPreview;
private OrientationHelper mOrientationHelper; private OrientationHelper mOrientationHelper;
private CameraEngine mCameraEngine; private CameraEngine mCameraEngine;
private Size mLastPreviewStreamSize;
private MediaActionSound mSound; private MediaActionSound mSound;
private AutoFocusMarker mAutoFocusMarker; private AutoFocusMarker mAutoFocusMarker;
@VisibleForTesting List<CameraListener> mListeners = new CopyOnWriteArrayList<>(); @VisibleForTesting List<CameraListener> mListeners = new CopyOnWriteArrayList<>();
@ -367,6 +368,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
@Override @Override
protected void onDetachedFromWindow() { protected void onDetachedFromWindow() {
if (!mInEditor) mOrientationHelper.disable(); if (!mInEditor) mOrientationHelper.disable();
mLastPreviewStreamSize = null;
super.onDetachedFromWindow(); super.onDetachedFromWindow();
} }
@ -413,8 +415,10 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
if (previewSize == null) { if (previewSize == null) {
LOG.w("onMeasure:", "surface is not ready. Calling default behavior."); LOG.w("onMeasure:", "surface is not ready. Calling default behavior.");
super.onMeasure(widthMeasureSpec, heightMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mLastPreviewStreamSize = null;
return; return;
} }
mLastPreviewStreamSize = previewSize;
// Let's which dimensions need to be adapted. // Let's which dimensions need to be adapted.
int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec);
@ -2036,17 +2040,26 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
@Override @Override
public void onCameraPreviewStreamSizeChanged() { public void onCameraPreviewStreamSizeChanged() {
mLogger.i("onCameraPreviewStreamSizeChanged");
// Camera preview size has changed. // Camera preview size has changed.
// Request a layout pass for onMeasure() to do its stuff. // Request a layout pass for onMeasure() to do its stuff.
// Potentially this will change CameraView size, which changes Surface size, // Potentially this will change CameraView size, which changes Surface size,
// which triggers a new Preview size. But hopefully it will converge. // which triggers a new Preview size. But hopefully it will converge.
mUiHandler.post(new Runnable() { Size previewSize = mCameraEngine.getPreviewStreamSize(Reference.VIEW);
@Override if (previewSize == null) {
public void run() { throw new RuntimeException("Preview stream size should not be null here.");
requestLayout(); } else if (previewSize.equals(mLastPreviewStreamSize)) {
} mLogger.i("onCameraPreviewStreamSizeChanged:",
}); "swallowing because the preview size has not changed.", previewSize);
} else {
mLogger.i("onCameraPreviewStreamSizeChanged: posting a requestLayout call.",
"Preview stream size:", previewSize);
mUiHandler.post(new Runnable() {
@Override
public void run() {
requestLayout();
}
});
}
} }
@Override @Override

Loading…
Cancel
Save