2011-03-17 4 views
0

SurfaceView가있는 앱을 실행 중입니다. 표면보기가 표시되면 '전원'버튼을 눌러 휴대 전화를 잠그고 원근감이 해제 된 앱으로 돌아갑니다. 그것은 내 "짧고 넓은"견해의 왼쪽에 "키가 크고 마른 체형"의 모습을 나타내는 것처럼 보입니다.레이아웃 잠김 후 Open GL SurfaceView 레이아웃 문제

onSurfaceChanged를 보면 전화가 'width = 480 height = 800'으로 전원이 켜지면 한 번 호출되고 'width = 800 height = 480'으로 전화가 풀린 후에 다시 호출됩니다. onSurfaceChanged에서 수집 한 정확한 새로운 너비/높이 데이터로 각 프레임을 gl.glFrustumf()라고 부르지 만, 무언가 여전히 내 창은 마른 체형과 키가 큰 것처럼 보입니다.

편집 : 아마 내 뷰 구조와 관련이 있습니다. 활동에있는 contentView가 MAINVIEW라고

.. 2

  MainView 
     /  \ 
    UIView  SurfaceView (I look wrong) 
    /
UI Elements 
(These all look correct) 

편집 번호 :

스크린 샷 :

LockScreenFail

글로브와 버튼 '추가 다운로드'가 그려집니다 3d. Square in은 UI보기의 하위 항목입니다 (UIView의 다른 하위 항목도 올바르게 표시됩니다). SurfaceView가 너비가 높이이고 너비가 너비라고 생각하는 것처럼 보입니다. 나는 표면보기의 폭과 높이를 더 인쇄를했고,이 출력 얻을 :

--Phone On Unlock Screen 
--Activity onWindowFocusChanged called 
I/System.out(8817): ***********UI Width: 480 UI Height: 800 
I/System.out(8817): ***********Main Width: 480 Main Height: 800 
I/System.out(8817): ***********GL Width: 480 GL Height: 800 

--App continues to run. These are triggered in GLSurfaceView onLayout 
I/System.out(8061): ***********UI Width: 800 UI Height: 480 
I/System.out(8061): ***********Main Width: 800 Main Height: 480 
I/System.out(8061): ***********GL Width: 800 GL Height: 480 

I/System.out(8061): ***********UI Width: 800 UI Height: 480 
I/System.out(8061): ***********Main Width: 800 Main Height: 480 
I/System.out(8061): ***********GL Width: 800 GL Height: 480 

그래서 너비와 높이가 언젠가 onWindowFocusChanged 후 자신을 해결하기 위해 나타나지만 그래픽이 제대로 표시되지 않습니다를.

편집 # 3 : 그런 다음

public void onSurfaceCreated(GL10 gl, EGLConfig config) { 

} 

:

public void onSurfaceChanged(GL10 gl, int width, int height) { 
    mWidth = width; 
    mHeight = height; 

    mAspectRatio = (float) width/height; 
    mSurfaceChangedID++; 
} 

I I 투사 내가 설정 2D UI 요소로 뭔가 3D 렌더링 아이디어와 다른 캔버스는 onDraw

의 각 프레임을 갖고 있기 때문에
public void onDrawFrame(GL10 gl) { 

    gl.glClearColor(mClearColorR, mClearColorG, mClearColorB, 1.0f); 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    for(each item) { 

     if(item.Is3d()) { 
      //For 3d Elements: 
      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity();      
      gl.glFrustumf(mAspectRatio*-mHalfViewAngleTan, mAspectRatio*mHalfViewAngleTan, -mHalfViewAngleTan, mHalfViewAngleTan, mNearZClip, mFarZClip);     

      //Enable Lighting, Setup fog 
      ... 

     } else { 
      //For UI Elements: 

      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity(); 
      gl.glOrthof(-0.5f*mAspectRatio, 0.5f*mAspectRatio, -0.5f, 0.5f, -1, 1); 

      //Disable Lighting, Disable fog, Setup blending 
      ... 
     } 

     //Setup client state and vertex buffers 
     ... 

     gl.glDrawArrays(GL10.GL_TRIANGLES, 0, mdl.getVtxCount()); 
    } 
}   

편집 # 4 :

,363,210

... 그것은는 ...

getMainView().addView(m3DView); 

그것은 지금

... 그것은 내가 서피스 뷰 SurfaceView가 상위에 추가하는 방법을 변경,보기 함께 할 수 있었나요 밝혀

// add to parent view 
    { 
     Display display = getWindow().getWindowManager().getDefaultDisplay(); 
     android.widget.AbsoluteLayout absLayout = new android.widget.AbsoluteLayout(this); 
     absLayout.setLayoutParams(new android.view.ViewGroup.LayoutParams(display.getWidth(), display.getHeight())); 
     absLayout.addView(m3DView, new android.view.ViewGroup.LayoutParams(display.getWidth(), display.getHeight())); 
     getMainView().addView(absLayout); 
    } 

답변

2

활동이 일시 중지되었다가 다시 시작될 때 GLSurfaceView에 알림을 보내야합니다. GLSurfaceView 클라이언트는 활동이 일시 중지되었을 때 onPause()를 호출해야하며, 활동이 재개 될 때 onResume()을 호출해야합니다. 이러한 호출을 통해 GLSurfaceView는 렌더링 스레드를 일시 중지했다가 다시 시작하고 GLSurfaceView가 OpenGL 디스플레이를 해제하고 다시 만들 수 있습니다.

이렇게하면 문제가 해결됩니다.

+0

나는 onPause와 onResume을 이미 호출하고 있었지만 많이 변경하지는 않았다. - 전화 잠금 해제 후 SurfaceView의 getWidth 및 getHeight를 인쇄하면 w = 480 h = 800 대신 다른 방법으로 나는보기를 잘못 관리하고있는 것처럼 느낍니다. – TurqMage

+0

아 .. 죄송합니다. 정말 요점을 놓쳤습니다. 스크린 샷을 게시하여 "날씬하고 키가 큰"것을 의미 할 수 있습니다. – Yuriy

+0

more info로 편집 – TurqMage