Oberflächenansicht im Layout

8

Ich habe also viel gesucht, aber ich kann immer noch nicht den genauen Grund finden, warum meine SurfaceView nicht angezeigt wird. Hier ist ein kleiner Hintergrund, was ich mache:

Ich habe ein lineares Layout, das horizontal eingestellt ist. Es enthält ein ImageView, dann ein vertikales lineares Layout und schließlich ein weiteres ImageView. Im vertikalen linearen Layout gibt es drei wesentliche Dinge: ein weiteres ImageView am oberen Rand, ein erweitertes SurfaceView (genannt MagnetView) und ein ImageView darunter.

Hier ist das xml:

%Vor%

Im Wesentlichen möchte ich, dass der MagnetView durch das Loch zeigt (oder ein Loch schlägt), wo ich es in das Layout einfüge. Aber es wird nicht angezeigt. Tatsächlich ist meine SurfaceView-Anzeige nur dann, wenn ich setContentView () der Aktivität explizit auf SurfaceView setze und alles andere lösche.

Hier ist die eigentliche Aktivität:

%Vor%

Sollte ich die SurfaceView am Anfang meiner Layout-XML platzieren? Gibt es mehr Attribute, die ich einstellen muss? Kann ich das SurfaceView einfach über alles andere legen, transparent machen und zeichnen, was ich brauche? Jede Hilfe wird sehr geschätzt, da ich nicht verstehen kann, wie SurfaceViews funktioniert. Es scheint, dass sie von meiner View-Hierarchie getrennt sind, aber dann sagt mir die Dokumentation, dass sie etwas völlig anderes sind.

Danke.

BEARBEITEN 04/17/2012

Um ein wenig mehr zu bieten: Mein xml UI Designer zeigt eine große Box in der Mitte für meine erweiterte SurfaceView-Klasse namens MagnetView. Ich habe es in rot umrissen. (Stackoverflow erlaubt mir noch keine Bilder zu posten)

UI Designer-Ansicht (http://24.media.tumblr.com/tumblr_m2mmqvBNwW1qreoco1_500.jpg) Ссылка

Hier ist die MagnetView (SurfaceView) -Klasse:

%Vor%     
akappel 17.04.2012, 05:30
quelle

6 Antworten

14
___ qstnhdr ___ Oberflächenansicht im Layout ___ antwort10240651 ___

Ich stelle nur die Änderungen auf.

  1. Ersetzen Sie die Oberflächenansicht in der XML-Datei mit LinearLayout.

    %Vor%
  2. Erhalte eine Instanz des linearen Layouts

    LinearLayout Oberfläche = (LinearLayout) findViewById (R.id.surface);

  3. Fügen Sie die Instanz der Oberflächenansicht zu LinearLayout

    hinzu

    surface.addView (neuer MagnetView (this));

2,3 Schritte sollten nach setContentView (R.layout.main);

durchgeführt werden     
___ qstntxt ___

Ich habe also viel gesucht, aber ich kann immer noch nicht den genauen Grund finden, warum meine SurfaceView nicht angezeigt wird. Hier ist ein kleiner Hintergrund, was ich mache:

Ich habe ein lineares Layout, das horizontal eingestellt ist. Es enthält ein ImageView, dann ein vertikales lineares Layout und schließlich ein weiteres ImageView. Im vertikalen linearen Layout gibt es drei wesentliche Dinge: ein weiteres ImageView am oberen Rand, ein erweitertes SurfaceView (genannt MagnetView) und ein ImageView darunter.

Hier ist das xml:

%Vor%

Im Wesentlichen möchte ich, dass der MagnetView durch das Loch zeigt (oder ein Loch schlägt), wo ich es in das Layout einfüge. Aber es wird nicht angezeigt. Tatsächlich ist meine SurfaceView-Anzeige nur dann, wenn ich setContentView () der Aktivität explizit auf SurfaceView setze und alles andere lösche.

Hier ist die eigentliche Aktivität:

%Vor%

Sollte ich die SurfaceView am Anfang meiner Layout-XML platzieren? Gibt es mehr Attribute, die ich einstellen muss? Kann ich das SurfaceView einfach über alles andere legen, transparent machen und zeichnen, was ich brauche? Jede Hilfe wird sehr geschätzt, da ich nicht verstehen kann, wie SurfaceViews funktioniert. Es scheint, dass sie von meiner View-Hierarchie getrennt sind, aber dann sagt mir die Dokumentation, dass sie etwas völlig anderes sind.

Danke.

BEARBEITEN 04/17/2012

Um ein wenig mehr zu bieten: Mein xml UI Designer zeigt eine große Box in der Mitte für meine erweiterte SurfaceView-Klasse namens MagnetView. Ich habe es in rot umrissen. (Stackoverflow erlaubt mir noch keine Bilder zu posten)

UI Designer-Ansicht (http://24.media.tumblr.com/tumblr_m2mmqvBNwW1qreoco1_500.jpg) Ссылка

Hier ist die MagnetView (SurfaceView) -Klasse:

%Vor%     
___ answer10188565 ___

Wenn ich nicht falsch liege, ist die Art, wie ich Ihre Anfrage wahrgenommen habe: Sie möchten, dass etwas über der Oberflächenansicht zusammen mit den anderen Ansichtselementen angezeigt / gerendert wird, wie Sie in der XML-Datei erwähnt haben.

Wenn Sie eine Ansicht oberhalb der Oberflächenansicht möchten, müssen Sie sie erweitern (AFAIK gibt es keine andere Möglichkeit). Dann müssen Sie die onDraw () -Methode überschreiben, um alle gewünschten Dinge in der Oberflächenansicht anzuzeigen. Sie müssen auch ein Objekt von SurfaceHolder abrufen, das die Zeichenfläche abruft.

Hier ist ein guter Link, der ein Bild auf die Oberfläche zeigt: Ссылка

    
___ answer10203364 ___
  1. Entfernen Sie die Oberflächenansicht aus dem XML und platzieren Sie stattdessen ein lineares Layout und ordnen Sie ihm eine ID zu.
  2. Erhalte eine Instanz von linearlayout.
  3. füge die Kindansicht hinzu, d. h. die Magnetansicht in diesem Fall zum linearen Layout mit

    addView ()

Das hat das Problem gelöst.

    
___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ answer26466060 ___

Haben Sie den Hintergrund von SurfaceView festgelegt? Ich habe festgestellt, dass wenn Sie den Hintergrund von SurfaceView festlegen, wird nicht angezeigt, was Sie auf dem sekundären Thread zeichnen.

    
___ answer41344840 ___

Sie könnten dies auch anders ausprobieren, indem Sie %code% nach %code%

verschieben %Vor%     
___ tag123surfaceview ___ SurfaceView ist ein Widget auf der Android-Plattform, das eine dedizierte Zeichenfläche bietet. ___ tag123layout ___ Das Layout-Tag ist für Fragen zur Platzierung, Ausrichtung und Ausrichtung von Objekten in Bezug auf ein enthaltendes Element gedacht. Bei Fragen zu CSS verwenden Sie stattdessen das "css" -Tag. ___ tag123androidlayout ___ Ein Layout definiert die visuelle Struktur für eine Benutzeroberfläche, z. B. die Benutzeroberfläche für ein Aktivitäts-, Fragment- oder App-Widget. ___ answer10186126 ___

Ich würde das Layout im Designer der Eclipse-Benutzeroberfläche untersuchen, um zu sehen, ob alles so platziert ist, wie Sie es möchten. Oberflächenansichten sind nur gewöhnliche Ansichten in Bezug auf das Layout.

    
___
Chaitanya 20.04.2012, 05:15
quelle
0

Ich würde das Layout im Designer der Eclipse-Benutzeroberfläche untersuchen, um zu sehen, ob alles so platziert ist, wie Sie es möchten. Oberflächenansichten sind nur gewöhnliche Ansichten in Bezug auf das Layout.

    
Alexander Kulyakhtin 17.04.2012 06:19
quelle
0

Wenn ich nicht falsch liege, ist die Art, wie ich Ihre Anfrage wahrgenommen habe: Sie möchten, dass etwas über der Oberflächenansicht zusammen mit den anderen Ansichtselementen angezeigt / gerendert wird, wie Sie in der XML-Datei erwähnt haben.

Wenn Sie eine Ansicht oberhalb der Oberflächenansicht möchten, müssen Sie sie erweitern (AFAIK gibt es keine andere Möglichkeit). Dann müssen Sie die onDraw () -Methode überschreiben, um alle gewünschten Dinge in der Oberflächenansicht anzuzeigen. Sie müssen auch ein Objekt von SurfaceHolder abrufen, das die Zeichenfläche abruft.

Hier ist ein guter Link, der ein Bild auf die Oberfläche zeigt: Ссылка

    
Chaitanya 17.04.2012 09:25
quelle
0
  1. Entfernen Sie die Oberflächenansicht aus dem XML und platzieren Sie stattdessen ein lineares Layout und ordnen Sie ihm eine ID zu.
  2. Erhalte eine Instanz von linearlayout.
  3. füge die Kindansicht hinzu, d. h. die Magnetansicht in diesem Fall zum linearen Layout mit

    addView ()

Das hat das Problem gelöst.

    
Chaitanya 18.04.2012 05:31
quelle
0

Haben Sie den Hintergrund von SurfaceView festgelegt? Ich habe festgestellt, dass wenn Sie den Hintergrund von SurfaceView festlegen, wird nicht angezeigt, was Sie auf dem sekundären Thread zeichnen.

    
PyChen 20.10.2014 12:46
quelle
0

Sie könnten dies auch anders ausprobieren, indem Sie setContentView(R.layout.main); nach super.onCreate(savedInstanceState);

verschieben %Vor%     
Alv_quena 27.12.2016 12:02
quelle