Ich habe ein einfaches Programm, das die Vorschau des Camera
in ein zeichnet SurfaceView
. Ich versuche, die onPreviewFrame
Methode zu verwenden, die jedes Mal aufgerufen wird, wenn ein neuer Frame in die gezeichnet SurfaceView
wird, um die invalidate
Methode auszuführen, die die Methode aufrufen soll onDraw
. Tatsächlich wird die onDraw
Methode aufgerufen, aber es wird nichts gedruckt (ich denke, die Kameravorschau überschreibt den Text, den ich zeichnen möchte).
Dies ist eine vereinfachte Version der SurfaceView
Unterklasse, die ich habe:
public class Superficie extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
public Camera camera;
Superficie(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(final SurfaceHolder holder) {
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera arg1) {
invalidar();
}
});
} catch (IOException e) {}
}
public void invalidar(){
invalidate();
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(w, h);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// nothing gets drawn :(
Paint p = new Paint(Color.RED);
canvas.drawText("PREVIEW", canvas.getWidth() / 2,
canvas.getHeight() / 2, p);
}
}
android
camera
surfaceview
Cristian
quelle
quelle
Antworten:
SurfaceView
funktioniertView
in dieser Hinsicht wahrscheinlich nicht wie ein Stammgast .Gehen Sie stattdessen wie folgt vor:
SurfaceView
Inneres in eineFrameLayout
oderRelativeLayout
in Ihre Layout-XML-Datei ein, da beide das Stapeln von Widgets auf der Z-Achse ermöglichenView
KlasseFrameLayout
oder eine Instanz der benutzerdefinierten View-Klasse hinzu, lassen SieRelativeLayout
sie jedoch nach demSurfaceView
Dadurch wird Ihre benutzerdefinierte
View
Klasse über dem angezeigtSurfaceView
.Hier finden Sie ein Beispielprojekt , bei dem Popup-Bedienfelder über ein
SurfaceView
für die Videowiedergabe verwendetes Fenster gelegt werden .quelle
SurfaceView
Widgets überlagern , wie ich es verstehe. "Was meinst du mit benutzerdefinierter View-Klasse?" - Ihre eigene Unterklasseandroid.view.View
oder Ihre eigene Unterklasse einer vorhandenen Widget-Klasse.SurfaceView
um Bitmap-Bilder zu zeichnen.ImageView
Verwendet beispielsweise keinSurfaceView
AFAIK.Versuchen Sie anzurufen
setWillNotDraw(false)
vonsurfaceCreated
:public void surfaceCreated(SurfaceHolder holder) { try { setWillNotDraw(false); mycam.setPreviewDisplay(holder); mycam.startPreview(); } catch (Exception e) { e.printStackTrace(); Log.d(TAG,"Surface not created"); } } @Override protected void onDraw(Canvas canvas) { canvas.drawRect(area, rectanglePaint); Log.w(this.getClass().getName(), "On Draw Called"); }
und anrufen
invalidate
vononTouchEvent
:public boolean onTouch(View v, MotionEvent event) { invalidate(); return true; }
quelle
Ich denke, Sie sollten die
super.draw()
Methode zuerst aufrufen , bevor Sie etwas in der Zeichenmethode von surfaceView tun.quelle