2016-08-31 1 views
0

私のカメラアプリのプレビューはOpenGL ES 2.0のGLSurfaceViewで実行されています。 logcatにエラーはありません。そして、アプリケーションのすべての機能が正しく動作します。しかし、後ろ向きのカメラから正面のカメラに切り替えるときや逆に切り替えるときに、ImageButtonが黒の空白になることがあります。AndroidのOpenGL ES環境でImageButtonが黒い空白に変わる

リアカメラカメラとフロントカメラを切り替える手順は次のとおりです。

-1。 (カスタマイズRendererクラスで)Rendererオブジェクト

public void onSurfaceDestroyed() { 
     ...... 

     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
     } 

     mSTexture.release(); 
     mSTexture = null; 
     mUpdateST = false; 
     pTexCoord = null; 
     pVertex = null; 
     deleteTexture(); 

     ...... 
} 

-2を破壊します。 (カスタマイズGLSurfaceViewクラスで)カメラビュー

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
     super.surfaceDestroyed(holder); 
     mRenderer.onSurfaceDestroyed(); 
     mRenderer = null; 
     mGestureDetector = null; 
     mHandler = null; 
} 

-3を破壊します。新しいカメラビューを作成する(MainActivityの場合)

public void addCameraView() { 
     mCameraView = new CameraView(this, mWidth, mHeight, mPicSizeR, mPicSizeF, mCameraMode, mFlashMode, mHandler); 
     FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER); 
     mCameraView.setLayoutParams(params); 
     mRootLayout.addView(mCameraView, 0); 
} 

-4最初は(カスタマイズされたGLSurfaceViewクラスのコンストラクタで)新しいRendererオブジェクト

public class CameraView extends GLSurfaceView { 
     CameraActivity.CameraHandler mHandler; 
     CameraRenderer mRenderer; 
     GestureDetector mGestureDetector; 

     CameraView(Context context, int width, int height, int picSizeR, int picSizeF, boolean camera, int flash, CameraActivity.CameraHandler handler) { 
      super(context); 

      mHandler = handler; 
      mRenderer = new CameraRenderer(this, width, height, picSizeR, picSizeF, camera, flash, handler); 
      setEGLContextClientVersion(2); 
      setRenderer(mRenderer); 
      setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
     } 
     ...... 
} 

を作成し、私はこの問題は、メモリの不足についてですと仮定しました。そして...メモリを増やすには、コードandroid:largeHeap="true"をマニフェストファイルに挿入してください。しかし、それはうまくいかなかった。

私は何が問題なのか分かりません。私は助けが必要です。

答えて

0

私はこの問題について解決策を得ました。 onSurfaceDestroyed()deleteTexture()を削除することです。 deleteTexture()の内容は次のとおりです。

public void deleteTexture() { 
    GLES20.glDeleteTextures(1, hTex, 0); 
} 

GLES20.glDeleteTextures()を呼び出す理由を正確に私にはわからない、できるだけ頻繁Rendererオブジェクトが破棄されると、混乱ImageButtonアップになります。私はOpenGL ES 2.0の使用に関する経験がほんの少ししかないからです。私はOpenGL ESをよく知っている誰かがそれをとてもうまく説明してくれることを願っています。 :)

関連する問題