Камера внутри ViewPager без задержек (как в Snapchat)?

У меня проблема с моим приложением, у меня есть предварительный просмотр камеры внутри ViewPager, но когда я пытаюсь провести пальцем с обеих сторон, он очень тормозит, и иногда, когда я быстро прокручиваю, между другим фрагментом и моим предварительным просмотром камеры появляется небольшое черное пространство.

Мой класс предварительного просмотра камеры (из учебника):

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

private final String TAG = "Camera Preview";

private SurfaceHolder mHolder;
private Camera mCamera;
Size mPreviewSize;
List<Size> mSupportedPreviewSizes;

public CameraPreview(Context context, Camera camera) {
    super(context);
    mCamera = camera;
    mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
    mHolder = getHolder(); // Install a SurfaceHolder.Callback so we get notified when the underlying surface is created and destroyed.
    mHolder.addCallback(this);
}

public void surfaceCreated(SurfaceHolder holder) {
    try {
        if (mCamera != null) {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        }
    } catch (IOException exception) {
        Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
   mCamera.stopPreview();
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    if (mHolder.getSurface() == null) {
        return;
    }

    try {
        mCamera.stopPreview();
    } catch (Exception e) {
    }

    try {

        Parameters params = mCamera.getParameters();
        List<String> focusModes = params.getSupportedFocusModes();
        if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
            params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        }
        params.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
        mCamera.setParameters(params);
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();

    } catch (Exception e) {
        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
    }

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
    final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);

    setMeasuredDimension(width, height);

    if (mSupportedPreviewSizes != null) {
        mPreviewSize =
                getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
    }
}

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {

    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio = (double) h / w;

    if (sizes == null)
        return null;

    Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    // find an size match aspect ratio and size
    for (Size size : sizes) {
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
            continue;
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }

    // Cannot find the one match the aspect ratio, ignore the requirement
    if (optimalSize == null) {
        minDiff = Double.MAX_VALUE;
        for (Size size : sizes) {
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
    return optimalSize;
}
    }

Вы знаете, как я могу сделать плавный предварительный просмотр камеры в ViewPager?

Как Snapchat, это было бы здорово!


person ChargerDukes    schedule 05.06.2015    source источник
comment
Можете ли вы опубликовать ссылку на учебник?   -  person chinmish    schedule 29.07.2017
comment
Нашли ли вы какое-либо решение проблемы?   -  person Ponomarenko Oleh    schedule 28.08.2019


Ответы (2)


Вы можете попробовать это для лучшей справки: http://opencamera.sourceforge.net/

person user1592261    schedule 05.06.2015

Я потратил много времени и кофе, но нашел причину беды. Проблема с использованием SurfaceView для предварительного просмотра.

Используйте TextureView для предварительного просмотра.

Это будет полезно: Как я могу сделать мой просмотр пейджера более гладкой?

Удачи!

person Qulery    schedule 09.11.2015