2014-03-25 37 views
0

我在ZBarScannerActivity類中自定義Zbar API的相機視圖。這是我添加的代碼。Zbar Android Costum相機預覽延伸

setContentView(R.layout.scanner); 

    mAutoFocusHandler = new Handler(); 

    // Create and configure the ImageScanner; 
    setupScanner(); 

    // Create a RelativeLayout container that will hold a SurfaceView, 
    // and set it as the content of our activity. 
    mPreview = new CameraPreview(this, this, autoFocusCB); 
    LinearLayout zbarLayout = (LinearLayout) findViewById(R.id.zbar_layout_area); 
    mPreview.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
    zbarLayout.addView(mPreview); 

然後當我運行應用程序的攝像頭預覽是錯誤的,所以我用它setDisplayOrientation至90。然後它已經旋轉,但攝像頭視圖被拉伸旋轉。這是我的CameraPreview代碼。

private final String TAG = "CameraPreview"; 

SurfaceView mSurfaceView; 
SurfaceHolder mHolder; 
Size mPreviewSize; 
List<Size> mSupportedPreviewSizes; 
Camera mCamera; 
PreviewCallback mPreviewCallback; 
AutoFocusCallback mAutoFocusCallback; 

CameraPreview(Context context, PreviewCallback previewCallback, AutoFocusCallback autoFocusCb) { 
    super(context); 

    mPreviewCallback = previewCallback; 
    mAutoFocusCallback = autoFocusCb; 
    mSurfaceView = new SurfaceView(context); 

    addView(mSurfaceView); 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = mSurfaceView.getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void setCamera(Camera camera) { 
    mCamera = camera; 
    if (mCamera != null) { 
     mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
     requestLayout(); 
    } 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    // We purposely disregard child measurements because act as a 
    // wrapper to a SurfaceView that centers the camera preview instead 
    // of stretching it. 
    final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
    final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); 
    setMeasuredDimension(width, height); 

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

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    if (changed && getChildCount() > 0) { 
     final View child = getChildAt(0); 

     final int width = r - l; 
     final int height = b - t; 

     int previewWidth = width; 
     int previewHeight = height; 
     if (mPreviewSize != null) { 
      previewWidth = mPreviewSize.width; 
      previewHeight = mPreviewSize.height; 
     } 

     // Center the child SurfaceView within the parent. 
     if (width * previewHeight > height * previewWidth) { 
      final int scaledChildWidth = previewWidth * height/previewHeight; 
      child.layout((width - scaledChildWidth)/2, 0, 
        (width + scaledChildWidth)/2, height); 
     } else { 
      final int scaledChildHeight = previewHeight * width/previewWidth; 
      child.layout(0, (height - scaledChildHeight)/2, 
        width, (height + scaledChildHeight)/2); 
     } 
    } 
} 

public void hideSurfaceView() { 
    mSurfaceView.setVisibility(View.INVISIBLE); 
} 

public void showSurfaceView() { 
    mSurfaceView.setVisibility(View.VISIBLE); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, acquire the camera and tell it where 
    // to draw. 
    try { 
     if (mCamera != null) { 
      mCamera.setPreviewDisplay(holder); 
     } 
    } catch (IOException exception) { 
     Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // Surface will be destroyed when we return, so stop the preview. 
    if (mCamera != null) { 
     mCamera.cancelAutoFocus(); 
     mCamera.stopPreview(); 
    } 
} 


private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
    final double ASPECT_TOLERANCE = 0.1; 
    double targetRatio = (double) w/h; 
    if (sizes == null) return null; 

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

    int targetHeight = h; 

    // Try to 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); 
      } 
     } 
    } 
    Log.d("Edgar", optimalSize.width + " " + optimalSize.height); 
    return optimalSize; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    if (holder.getSurface() == null){ 
     // preview surface does not exist 
     return; 
    } 

    if (mCamera != null) { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 
     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     requestLayout(); 

     mCamera.setDisplayOrientation(90); 
     mCamera.setParameters(parameters); 
     mCamera.setPreviewCallback(mPreviewCallback); 
     mCamera.startPreview(); 
     mCamera.autoFocus(mAutoFocusCallback); 
    } 
} 

請幫我解決相機視圖。感謝您的幫助。

回答

0

如果您試圖在縱向視圖中執行視圖,但基本上顯示的橫向視圖門戶網站並未「擠壓」,那麼我會建議您在其他佈局背後進行預覽。基本上你可以做

<RelativeLayout 
     android:layout_height="fill_parent" 
     android:layout_width="fill_parent" 
     > 
     <FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
      <LinearLayout 
      android:id="@+id/ticket_overlay" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="vertical" > 
      <... Some stuff here ... w/ background> 
      <... spacer here ... w/ transparent to show view portal> 
      <... Some stuff here ... w/ background> 
     </LinearLayout> 
    </FrameLayout> 
</RelativeLayout>