2016-09-29 237 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;)