2016-09-29 248 views
0

我有一個Qt 5.6.0應用程序在Android上使用帶有透明背景的QQuickView,它繪製了一些qml和一個純粹的android SurfaceView,它應該在後臺顯示視頻。Android:使用ZOrderMediaOverlay在SurfaceView中繪製qml

在啓動時,一切都很好。我的視頻在後臺播放,我的qml組件顯示在前臺。

我的問題是,當我的活動暫停,然後恢復,每次從我qml的頂部顯示視頻。 經過研究,我認爲這是因爲Qt創建的用於顯示qml的SurfaceView和我創建的用於顯示視頻的SurfaceView位於相同的「z區域」。所以渲染順序是未定義的。

我想通過將ZOrderMediaOverlay設置爲true來將Qt SurfaceView移動到ZOrderMediaOverlay區域,但我必須在創建SurfaceView時將其設置爲true。

當我創建我的QQuickView時,有沒有辦法直接從C++設置我的z順序? 還是有另一種方式?

我有一個從QtActivity繼承的自定義活動,但SurfaceView沒有在onCreate函數中創建。 當我爲視頻創建SurfaceView時,我可以訪問Qt SurfaceView,但已經創建了Qt的SurfaceView,並且設置了ZOrderMediaOverlay沒有效果。

非常感謝您的幫助:)

編輯:關於源代碼,只需將QQuickView的標誌的Qt :: WindowStayOnTopHint真應該創建表面ZOrderMediaOverlay設置爲true,但它似乎沒有上班。 視頻表面在恢復後在qml表面上方繪製,直到視頻表面被破壞並重新創建。

回答

1

您還必須插入您的SurfaceView到Android的ViewGroup容器中,Qt使用的部件了,但你的SurfaceView一定是背後QML的框架:

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); 
} 

我不推薦使用QQuickView提高性能, QML端只有ApplicationWindow;)