2011-04-13 4 views
11

우리는 1 주일 이상 동안 SurfaceViews와 관련된 몇 가지 문제를 해결하기 위해 노력해 왔으며 적절한 해결책을 찾지 못했습니다. 비슷한 문제 (및 Mixare 소스 코드)와 관련하여 포럼의 다른 질문을 읽었지만 답변을 찾지 못해서 어떻게 든 도와 줄 수 있기를 바랍니다.SurfaceView, Camera 및 OpenGL로 싸우기

시나리오 : 는 우리는 카메라

  • 카메라의 상단에 간다는 OpenGL 층의 서피스 뷰 SurfaceView에 대한
    • 서피스 뷰 SurfaceView

      있어요.
    • 화면에 표시되는 정보를 보여주는 다른보기입니다. 이것은 두 SurfaceViews의 상단에 있습니다.

    문제 :

    상관없이 우리가하려고 얼마나 열심히, 모두 SurfaceViews 분명히 서로 잘에 도착하지 않습니다. 우리가 시도 할 경우 :

    setContentView(mCameraPreview); 
    addContentView(mGLSurfaceView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    

    (논리적으로 보입니다.) 우리가 전화를 잠 그거나 잠금을 해제 할 때까지 예상대로 진행됩니다. 그 후, GLSurfaceView가 사라집니다 (InfoView가 아니라, 여전히 표시됨).

    대신, 우리가하려고하는 경우 :

    setContentView(mGLSurfaceView); 
    addContentView(mCameraPreview, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    

    그런 문제가 GLSurfaceView는 잠금/잠금 해제 후 나타나고, 그 전에 화면이 카메라와 InfoView의을 보여주고 있다는 점이다.

    우리는 뷰를 보여주는 액티비티에서 onStart()를 실행 한 후 4.6 초 (또는 그 이상) 메인 스레드를 잠자면 동작이 예상대로 (카메라, glsurface 및 info 뷰 모두 표시됩니다. 잠금/잠금 해제 후).

    우리는 더 우아한 해결책을 찾고 있습니다.

    Camera.open()에서 카메라가 예상보다 많은 시간이 걸리므로 카메라보기가 추가되고 GLSurfaceView가 추가되며 실제로 카메라가 열리면 GLSurfaceView 위에 열립니다. 이와 관련하여 GLSurfaceView에서 bringToFront()을 사용하여 정보보기 상단에 가져 왔지만 잠금/잠금 해제 후에도 카메라가 그 위에 계속 열려있어 카메라 미리보기가있는 화면 만 남겨 둡니다.

    아이디어가 있으십니까? SurfaceViews와 정보보기를 모두 위에 어떻게 표시 할 수 있습니까?

  • +0

    귀하의 질문은 제 지식을 뛰어 넘지 만, 컨테이너 활동에서 GLSurfaceView.onPause() 및 GLSurfaceView.onResume()을 호출하고 있는지 확인하십시오. 이것이이 주제에 대해 제가 생각할 수있는 전부입니다. – harism

    +0

    우리는 같은 문제를 해결하려고 노력하고있는 것 같습니다. 나는 [내 자신의] (http://stackoverflow.com/questions/5778647/how-to-properly-use-setzordermediaoverlay-on-android)를 올렸을 때 귀하의 질문을 보지 못했습니다. 'setZOrderMediaOverlay()'를 시도 했습니까?나는 그것을 시도했지만이 시나리오를 작동시키지 못했습니다. 어쩌면 당신은 그것을 사용하고이 문제를 해결하는 방법을 알아낼 수 있습니다. – alokoko

    답변

    2

    동일한 문제가있었습니다. 자신에게 암시하는 것처럼 복수형 SurfaceView은 Z 순서가 정의되지 않았기 때문에 서로 어울리지 않습니다.

    내 삼성 갤럭시 S2에서 주문하는 것은 설명하는대로 (다른 휴대 전화의 상태를 모르는 경우)입니다.

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
    
        //... 
    
        if (savedInstanceState == null) 
        { 
         initCamView(); 
         initOpenGL(); 
        } 
        else 
        { 
         initOpenGL(); 
         initCamView(); 
        } 
    
        //... 
    } 
    

    와 :

    private void initOpenGL() 
    { 
        mGLSurfaceView = new GLSurfaceView(this); 
        mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 
        mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT); 
    
        mOGLRenderer = new OGLRenderer(this); 
        mGLSurfaceView.setRenderer(mOGLRenderer); 
        mRL.addView(mGLSurfaceView); // mRL is the Relative Layout 
    } 
    

    하고 : I이 해결 방법은 상기 ActivityonCreate()에서의 처음 생성 확인된다

    private void initCamView() 
    { 
        mCamView = new CustomCameraView(this.getApplicationContext(), 
                this.getWindowManager()); 
        mRL.addView(mCamView); // mRL is the Relative Layout 
    } 
    

    없음 가장 우아한 용액 스레드를 4.6 초 동안 잠자 게하는 것보다 낫습니다.

    화면을 단일 방향으로 잠글 수도 있지만 오버레이를 올바른 방식으로 회전 시키려면 많은 못생긴 해킹을 수행해야합니다.

    Android 3.0 이상 (API 레벨 8) 만 타겟팅하는 경우 카메라를 OpenGL SurfaceTexture로 표시 할 수 있습니다. http://developer.android.com/reference/android/hardware/Camera.html#setPreviewTexture(android.graphics.SurfaceTexture)

    4

    이 시도 :

    mLayout.addView(mRenderView); 
    mLayout.addView(mCustomSurfaceView); 
    
    // without this line, the camera preview cannot be displayed 
    // when running activity at first time. 
    mCustomSurfaceView.setZOrderMediaOverlay(true); 
    

    이 나를 :) 근무

    저도 같은 문제가 있었다
    +0

    완벽 함, 이걸로 setZOrderOnTop (onTop)이 나에게 정확히 무엇을 찾고 있는지 알 수있었습니다. –

    1

    : 나는 GLSurfaceView 아래 서피스 뷰 SurfaceView를 원, 비디오를 재생하는 제 1 및 제 2 실행하기 게임.

    내가 한 것은 무엇이든,이 두 표면보기 사이의 z 순서는 무작위로 나타납니다.

    그러나 나는 해결책을 발견,이 게시물에 대한 감사 : https://stackoverflow.com/a/6028907/1557915

    트릭 된 setContentView/addContentView를 사용하여 레이아웃의 사용을 제거 할 수 있지만 대신하는 것입니다.

    1

    각 SurfaceView의 표면에는 Z 깊이가 있습니다. 기본 (하단), "미디어 오버레이"(위에 있음) 및 "상단"(보기 기반 UI를 포함하여 모든 것 위에 있음)의 세 가지 깊이가 가능합니다. 같은 깊이에 두 개의 겹치는 서페이스가 있다면 하나는 이길 것이지만 어느 것을 안정적으로 정의 할 수는 없습니다. 한 장치에서 다른 장치에서 다른 방식으로 작동하는 경우에만 일관된 동작을 얻을 수 있습니다.

    가능한 경우 하드웨어 오버레이로 구성됩니다. 현재 많이 사용되는 장치에는 4 개의 오버레이 평면이 있습니다. 이를 초과하면 컴포지션이 GPU로 완료됩니다. GPU가 더 비쌉니다. 상태 표시 줄, 탐색 막대 및 뷰 UI가있는 경우 3 가지이므로 저렴한 가격으로 하나의 SurfaceView 만 얻을 수 있습니다.

    예를 들어, 가능한 한 많은 것들을 GLES로 렌더링되는 표면에 결합하는 것이 가장 좋습니다. 여기에는 API 11 이상의 카메라 출력이 포함될 수 있습니다. 예를 들어 Grafika의 "카메라의 질감"활동을 참조하십시오. (Grafika에는 3 개의 표면 서페이스가 겹치는 데모 응용 프로그램이 있습니다. "다중 표면 테스트"활동 참조)

    SurfaceView의 작동 방식에 대해 자세히 알고 싶다면 Android System-Level Graphics 문서를 참조하십시오.