Android: Come creare un widget di anteprima della fotocamera personalizzato?

StackOverflow https://stackoverflow.com/questions/951121

  •  11-09-2019
  •  | 
  •  

Domanda

Sto cercando di sviluppare un widget personalizzato per l'anteprima della fotocamera. Vorrei riempire lo schermo con anteprima di fotocamera e disegnare alcuni pulsanti su di esso.

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 seguente modo:

<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 legare il widget seguente modo:

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 ricevo un messaggio di errore e non ho scoperto quello che potrebbe essere sbagliato.

Vorrei davvero apprezzare alcun aiuto per quanto riguarda questo problema.

Grazie!

È stato utile?

Soluzione

È necessario creare il seguente costruttore in SurfaceView per questo al 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 richiamare quando si utilizza tale componente in un file XML (al contrario di definire la vostra interfaccia grafica di programmazione). Che non funziona, ovviamente, da cui il messaggio di errore, che dovrebbe essere molto più chiara, a mio parere.

Il AttributeSet contiene tutti gli attributi menzionati nella dichiarazione XML, quindi se hai gli attributi personalizzati per l'apparecchio, è possibile recuperare e intraprendere azioni su di essi nel costruttore.

Altri suggerimenti

È possibile implementare un'onTouchListener () per la vista rispettato. Quando mai si fa clic sulla superficie automaticamente sistema Android vi porterà al metodo onTouchListener ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top