2016-09-29 4 views
0

Ich habe eine Qt 5.6.0 Anwendung auf Android mit einem QQuickView mit transparentem Hintergrund, die einige qml und eine reine Android SurfaceView, die ein Video im Hintergrund anzeigen soll zeichnen.Android: Zeichnen qml in SurfaceView mit ZOrderMediaOverlay

Beim Start ist alles gut. Mein Video wird im Hintergrund wiedergegeben und meine qml-Komponenten werden im Vordergrund angezeigt.

Mein Problem ist, wenn meine Aktivität pausiert ist dann wieder, jedes Mal, wenn das Video von meinem Qml oben angezeigt wird. Nach Forschung denke ich, ist es, weil das SurfaceView, das von Qt erzeugt wird, um das qml anzuzeigen, und mein SurfaceView, das geschaffen wird, um das Video anzuzeigen, in der gleichen "z Bereich" sind. Die Renderreihenfolge ist also nicht definiert.

Ich möchte die Qt SurfaceView in den ZOrderMediaOverlay Bereich verschieben, indem ich das ZOrderMediaOverlay auf true setze, aber ich muss es bei der Erstellung von SurfaceView einstellen.

Gibt es eine Möglichkeit, meine z-Reihenfolge direkt aus C++ zu setzen, wenn ich meine QQuickView erstelle? Oder gibt es einen anderen Weg?

Ich habe eine benutzerdefinierte Aktivität, die von QtActivity erbt, aber die SurfaceView ist noch nicht in der OnCreate-Funktion erstellt. Ich kann auf die Qt SurfaceView zugreifen, wenn ich meine SurfaceView für Video erstelle, aber die Qt's ist bereits erstellt und die ZOrderMediaOverlay hat keine Wirkung.

Vielen Dank für Ihre Hilfe :)

Edit: auf den Quellcode in Bezug auf, einfach die Flagge des QQuickView gesetzt Qt :: WindowStayOnTopHint auf true sollte die Oberfläche schaffen mit ZOrderMediaOverlay auf true gesetzt, aber es scheint nicht, arbeiten. Die Videooberfläche wird nach dem Fortsetzen über die qml-Oberfläche gezogen, bis die Videooberfläche zerstört und neu erstellt wurde.

Antwort

1

Sie müssen auch Ihre SurfaceView in ViewGroup Container Android einsetzen, dass Qt bereits für Widgets verwendet, aber Ihr SurfaceView muss hinter QML-Rahmen sein:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Init surface 
    surfaceView = new SurfaceView(this); 

    // It displaces original QML view. 
    // setContentView(surfaceView); 

    // Add SurfaceView to view container 
    View view = getWindow().getDecorView().getRootView(); 
    LinearLayout mainLinearLayout = (LinearLayout)(((ViewGroup)view).getChildAt(0)); 
    FrameLayout mainFrameLayout = (FrameLayout)(mainLinearLayout.getChildAt(1)); 
    mainFrameLayout.addView(surfaceView, 0); 
} 

ich nicht empfehlen QQuickView zu verwenden, um die Leistung zu erhöhen, nur ApplicationWindow auf QML Seite;)

Verwandte Themen