2009-06-04 9 views
7

J'essaie de développer un widget personnalisé pour l'aperçu de la caméra. Je voudrais remplir l'écran avec l'aperçu de la caméra et dessiner quelques boutons dessus.Android: Comment créer un widget d'aperçu de caméra personnalisé?

J'ai essayé de créer un widget sur mesure de la manière suivante:

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(); 
} 

} 

et modifié le fichier main.xml de la manière suivante:

<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> 

Dans la classe d'activité que j'ai essayé de lier le widget de la manière suivante:

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); 
} 

Chaque fois que j'essaie de déboguer l'application, je reçois un message d'erreur et je n'ai pas découvert ce qui pourrait être faux.

J'apprécierais vraiment toute aide concernant ce problème.

Merci!

Répondre

4

Vous devez créer le constructeur suivant dans SurfaceView pour que cela fonctionne:

CapturePreview(Context context, AttributeSet attrs)

Comme vous le savez peut-être, en Java les constructeurs ne sont pas héritées de c'est superclasse, mais c'est le constructeur que Android tente d'invoquer lorsque vous utilisez ce composant dans un fichier XML (par opposition à la définition de votre interface graphique par programme). Cela ne fonctionnera évidemment pas, d'où le message d'erreur, qui devrait être beaucoup plus clair, à mon avis.

Le AttributeSet contient tous les attributs mentionnés dans la déclaration XML. Par conséquent, si vous avez des attributs personnalisés pour votre composant, vous pouvez les récupérer et effectuer des actions dans le constructeur.

+0

Salut, j'ai la même question .. mais je ne veux pas vous ... plz m'aider ... –

-1

Vous pouvez implémenter un onTouchListener() dans la vue respectée. Lorsque vous cliquez sur la surface automatiquement, Android System vous amène à la méthode onTouchListener().

Questions connexes