2016-09-29 4 views
0

Qml을 그리는 투명한 배경과 배경에 비디오를 표시하는 순수 안드로이드 SurfaceView가있는 QQuickView가있는 Qt 5.6.0 응용 프로그램이 있습니다.Android : ZOrderMediaOverlay를 사용하여 SurfaceView에 qml 그리기

시작시 모든 것이 좋습니다. 내 비디오가 백그라운드에서 재생되고 qml 구성 요소가 포 그라운드로 표시됩니다.

제 문제는 내 qml의 상단에 비디오가 표시 될 때마다 내 활동이 일시 중지 된 후 다시 시작될 때입니다. 연구를 마친 후 Qt에서 만든 SurfaceView와 qml을 표시하기 위해 만든 SurfaceView가 같은 "z 영역"에 있기 때문에 생각합니다. 따라서 렌더링 순서는 정의되지 않습니다.

ZOrderMediaOverlay를 true로 설정하여 Qt SurfaceView를 ZOrderMediaOverlay 영역으로 이동하고 싶지만 SurfaceView 생성시 설정해야합니다.

QQuickView를 만들 때 C++에서 내 z 순서를 직접 설정할 수 있습니까? 다른 방법이 있습니까?

QtActivity에서 상속하는 사용자 지정 활동이 있지만 onCreate 함수에서 SurfaceView가 아직 만들어지지 않았습니다. 비디오 용 SurfaceView를 만들 때 Qt SurfaceView에 액세스 할 수 있지만 Qt 's가 이미 생성되고 설정되어 있으면 ZOrderMediaOverlay가 아무 효과가 없습니다.

도와 주셔서 감사합니다 많이 :)

편집 : 소스 코드에 대한, 단순히 ZOrderMediaOverlay true로 설정하여 표면을 생성해야 true로 QQuickView의 플래그 Qt는 :: WindowStayOnTopHint을 설정할 수 있지만하지 않는 것 일하다. 비디오 표면이 비디오 표면이 파괴되어 재생성 될 때까지 다시 시작한 후 qml 표면 위에 그려집니다.

답변

1

또한 Qt는 이미 위젯에 사용하는 안드로이드의 ViewGroup 용기로 SurfaceView를 삽입해야하지만 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); 
} 

I 성능을 증가 QQuickView을 사용하지 않는 것이 좋습니다, QML 쪽에서 만 ApplicationWindow)