ViewPager中的相机没有滞后(如Snapchat)?

时间:2015-06-05 12:20:47

标签: android android-fragments camera android-viewpager snapchat

我的应用程序有问题,我在ViewPager中有一个Camera Preview,但是当我尝试从两侧滑动时,它非常迟钝,有时当我快速滑动时,另一个之间有一点黑色空间片段和我的相机预览。

我的相机预览课程(来自教程):

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一样,它会很棒!

2 个答案:

答案 0 :(得分:0)

您可以尝试此操作以获得更好的参考http://opencamera.sourceforge.net/

答案 1 :(得分:0)

我花了很多时间和咖啡,但找到了麻烦的原因。 使用 SurfaceView 显示预览的问题。

使用 TextureView 显示预览。

它很有用:How can I make my view pager more smooth?

祝你好运!