2009-06-04 20 views
7

Sto provando a sviluppare un widget personalizzato per l'anteprima della fotocamera. Mi piacerebbe riempire lo schermo con l'anteprima della fotocamera e disegnare alcuni pulsanti su di esso.Android: come creare un widget di anteprima della fotocamera personalizzato?

ho cercato di creare un widget personalizzato seguente modo:

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

} 

e modificato il file main.xml modo seguente:

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

Nella classe di attività ho cercato di bind il widget nel modo seguente:

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

Ogni volta che provo a eseguire il debug dell'applicazione, ottengo un messaggio di errore e non ho scoperto cosa potrebbe essere sbagliato.

Apprezzerei davvero qualsiasi aiuto in merito a questo problema.

Grazie!

risposta

4

È necessario creare il seguente costruttore in SurfaceView per questo lavoro:

CapturePreview(Context context, AttributeSet attrs)

Come sapete, in Java costruttori non sono ereditate dal suo superclasse, ma questo è il costruttore che Android tenta di invocare quando si utilizza quel componente in un file XML (al contrario di definire la GUI a livello di programmazione). Ciò non funzionerà, ovviamente, da qui il messaggio di errore, che dovrebbe essere molto più chiaro, secondo me.

Il AttributeSet contiene tutti gli attributi citati nella dichiarazione XML, quindi se si dispone di attributi personalizzati per il componente, è possibile recuperare e intraprendere azioni su di essi nel costruttore.

+0

ciao, ho la stessa domanda ... ma non ho capito ... aiutami ... –

-1

È possibile implementare un onTouchListener() nella vista rispettata. Ogni volta che fai clic sulla superficie, Android System ti porta al metodo onTouchListener().

Problemi correlati