2016-09-29 2 views
0

У меня есть приложение Qt 5.6.0 на Android с QQuickView с прозрачным фоном, нарисовавшим какой-то qml и чистый андроид SurfaceView, который должен отображать видео в фоновом режиме.Android: рисовать qml в SurfaceView с ZOrderMediaOverlay

При запуске все хорошо. Мое видео воспроизводится в фоновом режиме, а компоненты qml отображаются на переднем плане.

Моя проблема в том, что моя деятельность приостановлена, а затем возобновляется, каждый раз, когда видео отображается сверху от моего qml. После исследования, я думаю, это потому, что SurfaceView, созданный Qt для отображения qml и моего SurfaceView, созданного для отображения видео, находится в одной и той же области «z». Таким образом, порядок визуализации не определен.

Я хотел бы переместить Qt SurfaceView в область ZOrderMediaOverlay, установив для ZOrderMediaOverlay значение true, но я должен установить его при создании SurfaceView.

Есть ли способ установить свой заказ z непосредственно из C++, когда я создаю свой QQuickView? Или есть другой способ?

У меня есть пользовательская активность, которая наследуется от QtActivity, но SurfaceView еще не создан в функции onCreate. Я могу получить доступ к Qt SurfaceView, когда создаю свой SurfaceView для видео, но тот же Qt уже создан, и ZOrderMediaOverlay не имеет никакого эффекта.

Большое спасибо за вашу помощь :)

Edit: в отношении к исходному коду, просто установите флаг QQuickView в Qt :: WindowStayOnTopHint истина должна создать поверхность с ZOrderMediaOverlay установлен верно, но это не кажется работать. Поверхность видео вычерчивается над поверхностью qml после возобновления до тех пор, пока поверхность видео не будет уничтожена и не будет восстановлена.

ответ

1

Вы также должны вставить ваш SurfaceView в ViewGroup контейнер Android, что 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 для повышения производительности, только ApplicationWindow на стороне QML;)