簡體   English   中英

ImageButton在Android的OpenGL ES環境中變成黑色空白

[英]ImageButton turns into black blank on OpenGL ES environment of Android

我的相機應用程序的預覽由OpenGL ES 2.0的GLSurfaceView運行。 logcat中沒有錯誤。 該應用程序的所有功能均正常運行。 但是,有時當我從后置攝像頭切換到前置攝像頭時, 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 addCameraView方法處)

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。 創建新的Renderer對象(在自定義GLSurfaceView類的構造函數中)

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" 但是,它沒有用。

我不知道出什么問題了。 我需要幫助。

我得到了有關此問題的解決方案。 這是要刪除onSurfaceDestroyed()中的deleteTexture() onSurfaceDestroyed() deleteTexture()的內容如下。

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

我不完全知道為什么Renderer對象被破壞時經常調用GLES20.glDeleteTextures()會導致ImageButton混亂。 因為我只有很少的使用OpenGL ES 2.0的經驗。 我希望有人能很好地了解OpenGL ES。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM