2009-06-04 19 views
7

Estoy tratando de desarrollar un widget personalizado para la vista previa de la cámara. Me gustaría llenar la pantalla con la vista previa de la cámara y dibujar algunos botones sobre ella.Android: ¿Cómo crear un widget de vista previa de cámara personalizado?

me han tratado de crear un widget personalizado de la siguiente manera:

import java.io.IOException; 

import android.content.Context; 
import android.hardware.Camera; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

class CapturePreview extends SurfaceView implements SurfaceHolder.Callback { 
    SurfaceHolder mHolder; 
    Camera mCamera; 

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

public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, acquire the camera and tell it where 
    // to draw. 
    mCamera = Camera.open(); 
    try { 
     mCamera.setPreviewDisplay(holder); 
    } catch (IOException exception) { 
     mCamera.release(); 
     mCamera = null; 
     // TODO: add more exception handling logic here 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // Surface will be destroyed when we return, so stop the preview. 
    // Because the CameraDevice object is not a shared resource, it's very 
    // important to release it when the activity is paused. 
    mCamera.stopPreview(); 
    mCamera = null; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // Now that the size is known, set up the camera parameters and begin 
    // the preview. 
    Camera.Parameters parameters = mCamera.getParameters(); 
    parameters.setPreviewSize(w, h); 
    mCamera.setParameters(parameters); 
    mCamera.startPreview(); 
} 

} 

y modificado el archivo main.xml la siguiente manera:

<RelativeLayout android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout"> 
<dev.video.client.CapturePreview android:id="@+id/capturePreview" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
</RelativeLayout> 

En la clase de actividad que he tratado de aprieto el widget de la siguiente manera:

private CapturePreview mPreview; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setFullscreen(); 

    setContentView(R.layout.main); 

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

    //mPreview = new CapturePreview(this); 
    //setContentView(mPreview); 

    mPreview = (CapturePreview)this.findViewById(R.id.capturePreview); 
} 

Cada vez que intento depurar la aplicación consigo un mensaje de error y no he descubierto lo que podría estar mal.

Realmente agradecería cualquier ayuda con respecto a este problema.

Gracias!

Respuesta

4

lo necesario para crear el siguiente constructor en SurfaceView para que esto funcione:

CapturePreview(Context context, AttributeSet attrs)

Como se puede saber, en Java constructores no se heredan de su superclase, sin embargo, este es el constructor que Android intenta invocar cuando usa ese componente en un archivo XML (en lugar de definir su GUI programáticamente). Eso no funcionará, por supuesto, de ahí el mensaje de error, que debería ser mucho más claro, en mi opinión.

El AttributeSet contiene todos los atributos mencionados en la declaración XML, por lo que si tiene atributos personalizados para su componente, puede recuperarlos y realizar acciones en ellos en el constructor.

+0

hola, tengo la misma pregunta ... pero no te llegué ... ayúdame por favor ... –

-1

Puede implementar un onTouchListener() en la vista respetada. Cuando haga clic en la superficie automáticamente, el sistema Android lo llevará al método onTouchListener().

Cuestiones relacionadas