Камера във ViewPager без забавяне (като Snapchat)?

Имам проблем с моето приложение, имам Camera Preview в 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