SurfaceView im ViewFlipper

  • 3 Antworten
  • Letztes Antwortdatum
C

cederick

Neues Mitglied
0
also ich habe einen ViewFlipper:
Code:
<ViewFlipper
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity"
    android:id="@+id/main_vf"
    android:layout_height="720px"
    android:layout_width="1280px"
    android:layout_gravity="center_horizontal|bottom"
    android:inAnimation="@anim/fade_in_vf"
    android:outAnimation="@anim/fade_out_vf"><!-- else view would disappear -->
   
        <include layout="@layout/menu_start"/>
    <include layout="@layout/loading_screen"/>
    <FrameLayout
        android:id="@+id/end_of_vf"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000000"
        android:layout_gravity="center_horizontal|bottom">

    </FrameLayout>
</ViewFlipper>
Das erste Layout ist ein Menü das zweite Layout wird gezeigt während ich meine Surfaceview initialisiere.
Im FrameLayout adde ich meine SurfaceView, das problem ist wenn die activity pausiert wird während die Surfacethread angezeigt wird und ausgeführt wird. Dann wird beim fortsetzen trotz vf.setDisplayedChild(1); die Surfaceview angezeit. die Frage(n) ist/sind warum ist das so und wie kann ich es ändern?
 
Ich weis immer noch nicht warum aber scheinbar vertragen sich der Viewflipper und die Surfaceview nicht. Desahlb habe ich jetzt einen,wahrscheinlich unsauberen, weg gewählt indem ich die flipperview wie folgt geändert habe.
Code:
<ViewFlipper
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity"
    android:id="@+id/main_vf"
    android:layout_height="720px"
    android:layout_width="1280px"
    android:layout_gravity="center_horizontal|bottom"
    android:inAnimation="@anim/fade_in_vf"
    android:outAnimation="@anim/fade_out_vf"><!-- else view would disappear -->
        <include layout="@layout/menu_start"/>
    <include layout="@layout/loading_screen"/>
    <ImageView
        android:id="@+id/end_of_vf"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000000">
    </ImageView>
</ViewFlipper>
hier ist das Image nur damit die animation noch angezeigt wird.
Weg:
1. Surfaceview wird gestartet
2. Callback an Activity (Surface is running)
3. ViewFlipper.setdisplayedchild(2);
4.animationslistener zeigt wann outanimation abgespielt wurde
5. setcontentview(FramLayout); (mit Surfaceview als child)
Jedesmal mal wenn die app fortgesetzt wird habe ich dann erst eine abgespeckte Version des viewflippers angezeigt und wieder bei "1." gestartet.

Durch die animation sieht es nicht so aus als würde es flackern und durch das anzeigen einer anderen View scheint es für den nutzer als würde die App schneller reagieren selbst wenn sie danach unter umständen noch laden muss.

Ich bin mir leider aber noch nicht 100%ig sicher warum ich die SurfaceView nicht im ViewFlipper verwenden konnte.
Das einzige was ich fand war android - rendaring issue with surfaceview in viewflipper? - Stack Overflow
 
Hallo. Die SurfaceView kannst du nciht als eine normale View verwenden. Diese ist eine Spezielle View die ein Loch quasi durch deine MainView Hierarchy haut udn ein eigenes Surface /Window erstellt.

Also kurz: Das funktioniert nciht mit dem ViewFlipper da musst du eine Alternative finden z.B. TextureView wie es in deinem Link erwähnt wird....


Alternative: Setze einfach die Views in deinem FrameLayout wie gewohnt und toggle einfach die Visibility der Views...
 
  • Danke
Reaktionen: cederick
Jaiel schrieb:
Alternative: Setze einfach die Views in deinem FrameLayout wie gewohnt und toggle einfach die Visibility der Views...
Das hatte ich schon getan ich habe sogar schon versucht die Surfaceview komplett zu removen (wenn pausiert wird) und sie dann neu hinzuzufügen (wenn fortgesetzt wird) nur hatte ich dann einen Blackscreen obwohl ich das child loading_screen ja angezeigt habe und der loading_screen nicht verändert wurde. Dann dachte ich es würde an der Animation liegen (fill after) doch nachdem ich die rausgenommen habe hatte ich immer noch Blackscreen also dachte ich mir es muss an dem Framelayout liegen. Weshalb ich dann diesen oben beschreibenen cheesy weg genutzt habe. Obwohl mir jetzt noch einfällt ich könnte versuchen das Framelayout komplett zu entfernen bzw. die "Visibility zu togglen" aber das macht jetzt auch keinen unterschied mehr. Denn die Animation würde nicht abgespielt werden egal welchen weg ich nehme und performence technisch ändert sich auch nichts.
 
Zurück
Oben Unten