2013-08-10 2 views
0

Im разрабатывающее приложение, использующее сканер кода Zbar qr. Everthing отлично работает, но я хочу добавить текст в предварительный просмотр камеры, и Im не смог это сделать. Когда я добавляю текст, просмотр камеры исчезает. Недостаточно информации об этом, и Id действительно оценивает, если кто-то мне поможет. Благодаря !Как добавить textVIEW в камеру Previw

это код моего CameraPreview.java, который выглядит как сделает волшебную

package com.dm.zbar.android.scanner; 

import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.AutoFocusCallback; 
import android.hardware.Camera.PreviewCallback; 
import android.hardware.Camera.Size; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

import java.io.IOException; 
import java.util.List; 

class CameraPreview extends ViewGroup implements SurfaceHolder.Callback { 
    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); 


     TextView tvtest = new TextView(context); 
     LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0,0); 
     tvtest.setLayoutParams(layoutParams); 
     tvtest.setText("Сканирайте QR !"); 
     addView(tvtest); 




     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); 
       } 
      } 
     } 
     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.setParameters(parameters); 
      mCamera.setPreviewCallback(mPreviewCallback); 
      mCamera.startPreview(); 
      mCamera.autoFocus(mAutoFocusCallback); 
     } 
    } 

} 

Это часть я additionly добавил в код, но cameraPreviwe исчезнет до тех пор, как я добавить его.

 TextView tvtest = new TextView(context); 
     LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0,0); 
     tvtest.setLayoutParams(layoutParams); 
     tvtest.setText("Сканирайте QR !"); 
     addView(tvtest); 

ответ

0

Почему бы не добавить TextView в main.xml файле. Когда вы программно добавляете SurfaceView, я думаю, что он перекрывает расположение XML-файла, поэтому ваш CameraPreview исчезает.

+0

Я не думаю, что эта активность имеет xml-представление макета. Что такое файл main.xml, о котором вы говорите? –

+0

Я думал, что вы использовали 'main.xml', как указано в примере приложения ZBar, чтобы пройти через то, что они используют« TextView », чтобы показать результат QRCode. – ved

+0

Результат, который они показывают, действительно находится в действии, но я хочу установить некоторый текст над просмотром камеры не на экране результатов –

0

Моя идея: вы можете снимать изображение и устанавливать фон в макет и помещать текстовое изображение в этот макет и снимать экран телефона. Удачи.

Смежные вопросы