2

[編集:修正済み! 問題は、レイアウト xml で GLSurfaceView をオーバーレイする非表示の VideoView があるようです。レイアウトから VideoView を削除すると、期待される動作が復元されます。]

[編集 #2: GLSurfaceView で ARGB888 を使用するようにすると、これも修正されるはずです (異なるカラー フォーマットのサーフェスを混在させることはできません)。それ以来、GL をビデオ上に表示するようにしました。]

GLSurfaceView を正常に使用していますが、Android 3.2 タブレットで奇妙な問題が発生しています。GLSurfaceView アクティビティは、AndroidManifest を使用して横向きを強制します。縦向きの既存のアクティビティから開始すると、画面が回転し、GLSurfaceView が期待どおりに機能します。横向きのアクティビティから開始すると、GLSurfaceView は黒になります。これは単なるテクスチャの問題ではなく、glClearColor も、glDrawArray による塗りつぶし三角形も表示されません。

  • 画面を回転させると (マニフェスト ディレクティブを削除した後に手動で、またはマニフェスト ディレクティブの有無にかかわらず setRequestedOrientation を介して)、機能し始めます。

  • 戻るボタンを押すと、アクティビティが終了すると、予想されるレンダリングされた GLSurfaceView が一瞬表示されます。

  • 新しいアクティビティ (SettingsActivity) を開始すると、新しいアクティビティを開始するとき、および [戻る] ボタンを押して GLSurfaceView アクティビティに戻るときに、予期されるレンダリングされた GLSurfaceView がちらつきます (その後、画面が再び黒くなります) 。デバイスは横向きです。デバイスを縦向きモードにしてから設定アクティビティを開始すると、GL のちらつきは見られませんが、押し戻す前に縦向きに回転すると、GLSurfaceView アクティビティが再開したときにちらつきが見られます。

  • エミュレーターでも Android 4.0.4 フォンでも、この動作は見られません。

onCreate で GLSurfaceView を作成し、レイアウト xml の FrameLayout に追加します。

対応するアクティビティ メソッドから GLSurfaceView の一時停止および再開メソッドを呼び出しています。これが私の onSurfaceCreated および onSurfaceChanged ハンドラーです。

public final static void onSurfaceCreated(GL10 pGL) {
    pGL.glClearColor(0.5f, 0.5f, 0.5f, 1f);

    pGL.glEnable(GL10.GL_TEXTURE_2D);

    pGL.glEnable(GL10.GL_BLEND);
    pGL.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);

    pGL.glShadeModel(GL10.GL_FLAT);
    pGL.glDisable(GL10.GL_DEPTH_TEST);

    pGL.glDisable(GL10.GL_DITHER);
    pGL.glDisable(GL10.GL_LIGHTING);
}

public final static void onSurfaceChanged(GL10 pGL, int pWidth, int pHeight) {
    pGL.glViewport(0, 0, pWidth, pHeight);

    pGL.glMatrixMode(GL10.GL_PROJECTION);
    pGL.glLoadIdentity();
    pGL.glOrthof(0f, pWidth, 0f, pHeight, -1f, 1f);
    pGL.glMatrixMode(GL10.GL_MODELVIEW);
}

GLSurfaceView の設定方法は次のとおりです。

    mGLSurfaceView = new GLSurfaceView(pContext);
    mGLSurfaceView.setEGLConfigChooser(false);  // no depth buffer

    mGLSurfaceView.setRenderer(this);
    mGLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR);

onSurfaceCreated と onSurfaceChanged (予想されるサイズ)、および onDrawFrame が呼び出されていることを確認するためのログを追加しました。

TabHost 内で GLSurfaceView を使用している誰かから同様のレポートが見つかりましたが、適切な解決策はありません: https://groups.google.com/forum/?fromgroups#!topic/android-developers/fXPfgw6AoeY

フォーカスのリクエスト、無効化、レイアウトのリクエストなどの組み合わせを試しましたが、成功しませんでした。ここにいる誰かが私が光を見るのを手伝ってくれることを願っています!

4

1 に答える 1

1

自分の質問に答える: 修正済み! 問題は、レイアウト xml で GLSurfaceView をオーバーレイする非表示の VideoView があるようです。レイアウトから VideoView を削除すると、予想される動作が復元されます。

于 2012-05-18T21:22:08.510 に答える