1

我的應用程序有問題,我在ViewPager中有一個Camera Preview,但是當我嘗試從兩側滑動時,它非常滯後,有時候我快速滑動,其他片段和我的相機預覽之間會有一點點黑色空間。ViewPager裏面的攝像頭沒有滯後(像Snapchat)?

我的攝像頭預覽類(從教程):

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一樣,它會很棒!

+0

你可以發佈鏈接到教程嗎? – chinmish

回答