質問

OpenGL を利用する Android アプリを構築しています。現状では、その背景には、 GLSurfaceView コードによって動的に生成され、テクスチャとしてロードされ、描画されます。 glDrawTexfOES. 。これは「OK」ですが、(OpenGL を使用せずに) 画像を独自の表面にはるかにスムーズに表示することができます。の背景を作る方法はありますか? GLSurfaceView 透明?これができるという噂を聞いたことがあります setEGLConfigChooser, しかし確証は見つかりませんでした。最終的には、描画しているサーフェスを取得して、 GLSurfaceView その上に重ねてレイヤード効果を実現します。

これは難しく、おそらく実行不可能であることは承知していますが、ご意見をお待ちしております。前もって感謝します。

役に立ちましたか?

解決

私はこの仕事を得るためにやった

ただ、いくつかの簡単な変更ます。

私のGLSurfaceView.Rendererオンます:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glDisable(GL10.GL_DITHER);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,
            GL10.GL_FASTEST);

     gl.glClearColor(0,0,0,0);
     gl.glEnable(GL10.GL_CULL_FACE);
     gl.glShadeModel(GL10.GL_SMOOTH);
     gl.glEnable(GL10.GL_DEPTH_TEST);
}

私のGLSurfaceViewオンます:

setEGLConfigChooser(8, 8, 8, 8, 16, 0);
getHolder().setFormat(PixelFormat.TRANSLUCENT);

他のヒント

あなたのGLSurfaceViewsetZOrderOnTop(true);が必要です。

私は(背景が透明/オーバーレイ)のチャートを表示するには、私自身のGLSurfaceViewクラスを使用します。 私の拡張GLSurfaceViewはポップオーバーウィンドウにXMLを経由して埋め込むされます。

<com.dsignmatters.iq_fitfunlite.GLPieChartView          
    android:id="@+id/gameprogress_chart"
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content"
    ...

活動の一環として、私はこのコードを追加します:

mGamesuccessPieChart = (GLSurfaceView) gameprogressView.findViewById(R.id.gameprogress_chart);
mGamesuccessPieChart.setZOrderOnTop(true);

ではなく、少なくとも最後に、私のGLSurfaceViewは次のようになります:

public class GLPieChartView extends GLSurfaceView {
    public GLPieChartView(Context context) {
        super(context);
        initGL();
    }

    public GLPieChartView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initGL();
    }

    void initGL() {
        setEGLContextClientVersion(2);
        setEGLConfigChooser(8,8,8,8,16,0);
        setRenderer(new GLPieChartRenderer());
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
        getHolder().setFormat(PixelFormat.TRANSLUCENT);     
    } 
}

私のレンダラクラスGLPieChartRendererは全くglClearColorを呼び出すことはありません。

最後のコードサンプルは、透明性を有効にするためのものです。 GLSurfaceView. 。ただし、透明度を使用する前に、 GLSurfaceView, 、次のマイナス点を考慮してください。

  1. 透明性を有効にするには、以下を使用する必要があります setZOrderOnTop の上 GLSurfaceView. 。これにより、他のビューを配置できなくなります (例: TextView ) 透明の上に GLSurfaceView. 。ナビゲーションドロワーでさえ、透明なドロワーの上にスライドすることはできません GLSurfaceView(無視 トリック )。透明か否か、 GLSurfaceView 他の Android ビューの上または下にのみ存在でき、それらの間には存在できません。
  2. 透明性を得るには、以下を使用する必要があります。 setEGLConfigChooser そして setFormat 以下の例のように。つまり、その特定のデバイスに最適な、システムによって選択されたデフォルトの形式を取得することはできません。さらに重要なのは、デバイスがサポートされている形式であることを確認し、この gsoc のように期待される形式が存在しない場合は代替手段を選択する必要があることです。 .

透明性に関するその他のオプション.

  1. ランニング Tracer Android の opengl の場合、アクティビティの背景画像が opengl テクスチャとして描画されることがわかります。だから、作る代わりに GLSurfaceView 可能であれば、GLSurfaceView で背景を opengl テクスチャとしてレンダリングすることもできます。
  2. また、サーフェス上のアルファ チャネルまたは透明度は、opengl でのアルファ ブレンディングの前提条件ではありません。どちらも独立しています。
  3. TextureView (騙す) opengl コンポーネントを他のビューの間に埋め込む場合は、これが良い代替手段となります。これ 起こる ゲームは非常に良い例です GLSurfaceView Android での 2D 描画。

透明なレイアウト XML とコードを含む以下のサンプル GLSurfaceView 背景付き。

  1. XMLファイルをレイアウトする green 背景色

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="#00FFFF">
    
    <android.opengl.GLSurfaceView
        android:id="@+id/mySurfaceView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    
    </RelativeLayout>
    
  2. MainActivity.java ファイル。変化 ALPHA 表面の色を確認するには 0.0 ~ 1.0 の変数を使用します red 背景アクティビティの色と混合する green

    package com.example.transparentsurfaceview;
    
    import android.app.Activity;
    import android.graphics.PixelFormat;
    import android.opengl.GLES20;
    import android.opengl.GLSurfaceView;
    import android.os.Bundle;
    
    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;
    
    public class MainActivity extends Activity {
    
        private GLSurfaceView mSurfaceView;
        private static float ALPHA = 0.5f;
        private static float RED   = 1.0f;
        private static float GREEN = 0.0f;
        private static float BLUE  = 0.0f;
    
        protected void onCreate( Bundle savedInstanceState ) {
            super.onCreate( savedInstanceState );
            setContentView( R.layout.activity_main );
            mSurfaceView = (GLSurfaceView)findViewById( R.id.mySurfaceView );
    
            mSurfaceView.setEGLContextClientVersion( 2 );
            mSurfaceView.setZOrderOnTop( true );
            mSurfaceView.setEGLConfigChooser( 8, 8, 8, 8, 16, 0 );
            mSurfaceView.getHolder().setFormat( PixelFormat.RGBA_8888 );
    
            mSurfaceView.setRenderer( new GLSurfaceView.Renderer() {
                public void onSurfaceCreated( GL10 gl10, EGLConfig eglConfig ) {
                    GLES20.glClearColor( RED, GREEN, BLUE, ALPHA );
                }
    
                public void onSurfaceChanged( GL10 gl10, int i, int i2 ) {}
    
                public void onDrawFrame( GL10 gl10 ) {
                    GLES20.glClear( GLES20.GL_COLOR_BUFFER_BIT );
                }
            });
        }
    }
    

あなたは活動の背景が透明であることを確認しなければならない!

アクティビティの背景が不透明である場合は、コンテンツビュー(glsurfaceview)は半透明であっても、その後、それがその背景としての活動の白い背景が表示されます、デフォルトでは白と言っています。

あなたが助けを公式APIのデモTranslucentGLSurfaceViewActivityを参照してください、それが宣言されAndroid.manifestでの活動の背景の透明度を設定することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top