Ok, dank Fadden fand ich die einfachste Lösung (zumindest für mich).
Zuerst habe ich erstellt eine andere Oberfläche Ansicht und meine XML-Datei wie folgt aussehen:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:opencv="http://schemas.android.com/apk/res-auto"
android:layout_gravity="left|top">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<SurfaceView
android:layout_alignParentTop="true"
android:id="@+id/CameraView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<SurfaceView
android:layout_alignParentTop="true"
android:id="@+id/TransparentView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
</RelativeLayout>
Und als ich einen anderen Halter für die neue Oberfläche geschaffen, das ist ein Teil meiner Java-Code:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_capture);
// Create first surface with his holder(holder)
cameraView = (SurfaceView)findViewById(R.id.CameraView);
cameraView.setOnTouchListener(onTouchListner);
holder = cameraView.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// Create second surface with another holder (holderTransparent)
transparentView = (SurfaceView)findViewById(R.id.TransparentView);
holderTransparent = transparentView.getHolder();
holderTransparent.setFormat(PixelFormat.TRANSPARENT);
holderTransparent.addCallback(callBack);
holderTransparent.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
Endlich habe ich eine Methode ‚DrawFocusRect‘
private void DrawFocusRect(float RectLeft, float RectTop, float RectRight, float RectBottom, int color)
{
canvas = holderTransparent.lockCanvas();
canvas.drawColor(0,Mode.CLEAR);
//border's properties
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(color);
paint.setStrokeWidth(3);
canvas.drawRect(RectLeft, RectTop, RectRight, RectBottom, paint);
holderTransparent.unlockCanvasAndPost(canvas);
}
genannt implementieren Wie Sie sehen können, habe ich klar die Leinwand jedes Mal, wenn ich dies nicht mache, wird die Oberfläche zusätzlich mehr Rechtecke auf einander anzeigen. Diese
ist, wie ich auf diese Methode aufrufen, von einem 'OnTouchListener' Veranstaltung:
OnTouchListener onTouchListner = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
RectLeft = event.getX() - 100;
RectTop = event.getY() - 100 ;
RectRight = event.getX() + 100;
RectBottom = event.getY() + 100;
DrawFocusRect(RectLeft , RectTop , RectRight , RectBottom , Color.BLUE);
}
};
Hope this für jemand anderen hilfreich sein würde.
Eine bestimmte SurfaceView-Oberfläche kann nur einen "Producer" haben. Da die Kamera darauf zeichnet, kann man nicht mit einem Canvas darauf zeichnen. Sie müssen auf einer anderen Oberfläche zeichnen; Am effizientesten wäre es, eine transparente Ansicht zu verwenden. Ein anderer Ansatz wäre, die Kamera zu einer SurfaceTexture zu senden und sie mit GLES zu rendern, was Ihnen volle Freiheit gibt. Siehe z.B. "Textur von Kamera" auf https://github.com/google/grafika. – fadden
Können Sie mir ein Beispiel geben, wie Sie eine transparente Ansicht erstellen? Alles, was ich gefunden habe, sind Beispiele, die nur ein Rechteck zeigen und die Ansicht als * setContentView (drawView); * so einstellen, dass ich die Kamera nicht sehen kann. – user2235615