2

Ich habe ein FrameLayout, das zuerst ein SurfaceView enthält, und ein RelativeLayout, das wiederum verschiedene Buttons und TextViews enthält.Android: SurfaceView und Z-Level Frage

Auf dem Canvas der SurfaceView zeichne ich zahlreiche Bitmaps, und über Touch und Motion Events kann der Benutzer sie ziehen.

Diese Bitmaps übergeben unter die Buttons etc, die in der RelativeLayout sind.

Nun, es ist mein (möglicherweise falsch) ist das Verständnis, dass die „Z-Ebene“ des Surface, oder was auch immer es, dass für sie hat passiert, ist völlig unabhängig von der tatsächlichen Z-Ebene des Rests des Layouts . Ist das der Fall? Wenn ja, wie kann ich es umgehen, so dass gezogene Bitmaps auf andere Ansichten gezogen werden? Oder wie sonst kann ich eine Leinwand im Vollbildmodus implementieren, ohne dass meine Schaltflächen usw. wie die Steuerelemente eines Overlays wirken?

Ich denke, was ich eigentlich brauche, ist eine Unterlage, wo Berührungsereignisse immer noch von den Tasten usw. darunter aufgenommen werden können. Aber ich weiß nicht, wie ich das erreichen soll, denn wenn ich meine Leinwand neu zeichne, muss ich auch den Hintergrund neu zeichnen.

Kann ich die Reihenfolge von RelativeLayout und SurfaceView innerhalb von FrameLayout vertauschen und den Hintergrund von Canvas transparent machen? Wenn das so ist, wie? Berühren Ereignisse immer noch "fallen" auf die Tasten darunter?

Danke, dass du mich begleitet hast. Ich weiß, dass ich ein bisschen waffler bin.

Antwort

0

Können Sie ein bisschen mehr klären? Haben Sie in Ihrer SurfaceView einen Hintergrund zugewiesen? Wenn nicht, könnten Sie wahrscheinlich auch AbsoluteView verwenden, wenn Sie Teile einfach herumziehen möchten. Wenn kein Hintergrund vorhanden ist, sollten Sie in der Lage sein, die gesamte Ansicht oberhalb der RelativeView-Ansicht zu platzieren und nur die verschiedenen Schaltflächen und solche in der Ansicht oben angezeigt zu haben, die ziehbar sind und über allem anderen bleiben.

+0

Hallo, danke für die Antwort. Wenn ein Bitmap gezogen wird, hinterlässt es während des MotionEvent eine Spur von neu gezeichneten Kopien von sich selbst, es sei denn, der Canvas-Hintergrund wird auf COLOR.Black gesetzt, bevor der aktuelle Speicherort des Bitmap gezeichnet wird. Also, ja, es gibt einen Hintergrund für das SurfaceView/Canvas. – JimBadger

1

SurfaceView funktioniert nicht so.

SurfaceView besteht aus zwei Teilen, dem "View" -Teil und dem "Surface" -Teil. Der "Ansicht" -Teil ist ein transparentes Loch, das mit den anderen Ansichtselementen ausgelegt und auf die Ansichtsebene zusammengesetzt wird. Der "Oberflächen" -Teil ist eine vollständig separate Ebene, die positioniert und skaliert wird, um mit dem "Ansicht" -Teil übereinzustimmen, und durch den Systemkompositor und nicht durch die App zusammengesetzt wird.

Sie können die Z-Reihenfolge des "Surface" Layers steuern, wenn das SurfaceView zuerst erstellt wird, aber es wird über oder unter allen View-Elementen sein. Es kann nicht über einige Views und unter anderen liegen, da sie völlig unabhängige Layer sind. Die Ebene "Oberfläche" fängt keine Eingabeereignisse ab, daher wirkt sich die oberste Ebene (über SurfaceView#setZOrderOnTop()) nicht auf den Eingabefokus aus.

Für API 14+ können Sie eine TextureView verwenden, die sich in einer View-freundlichen Weise verhält.

Edit: für weitere Details, siehe die .