Frage

Ich versuche, eine benutzerdefinierte Widget für die Kameravorschau zu entwickeln. Ich möchte den Bildschirm mit Kamera-Vorschau füllen und einige Tasten über sie ziehen.

Ich habe versucht, eine benutzerdefinierte Widget die folgende Art und Weise zu erstellen:

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

}

und modifiziert die main.xml die folgende Art und Weise Datei:

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

In der Aktivitätsklasse Ich habe versucht, das Widget die folgende Art und Weise zu binden:

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

Jedes Mal, wenn ich versuche, die Anwendung zu debuggen ich eine Fehlermeldung erhalten, und ich habe nicht herausgefunden, was falsch sein könnte.

Ich würde wirklich schätzen jede Hilfe zu diesem Problem.

Danke!

War es hilfreich?

Lösung

Sie müssen den folgenden Konstruktor in Surface für diese Arbeit erstellen:

CapturePreview(Context context, AttributeSet attrs)

Wie Sie vielleicht wissen, in Java Konstruktoren werden nicht vererbt aus es übergeordnete Klasse, aber das ist der Konstruktor, der Android versucht aufzurufen, wenn Sie diese Komponente in einer XML-Datei verwenden (im Gegensatz zu der Definition Ihrer GUI programmatisch). Das wird nicht funktionieren, natürlich, damit die Fehlermeldung, die viel mehr klarer, meiner Meinung nach sein sollte.

Die AttributeSet enthält jedes Attribut erwähnt in der XML-Deklaration, also wenn Sie benutzerdefinierte Attribute für Ihre Komponente haben, können Sie abrufen und Aktionen auf sie im Konstruktor.

Andere Tipps

Sie können eine onTouchListener () zu der angesehenen Ansicht implementieren. Wann immer Sie auf der Oberfläche klickt automatisch wird Android-System gelangen Sie auf die onTouchListener () -Methode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top