سؤال

أنا بناء تطبيق أندرويد يستفيد من OpenGL. كما يقف، الخلفية ل GLSurfaceView يتم إنشاؤه ديناميكيا بواسطة الرمز الخاص بي وتحميله كملمس ورسمه glDrawTexfOES. وبعد ما هو "موافق"، لكن يمكنني ببساطة عرض الصورة أكثر بسلاسة لسطحها الخاص (بدون 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);

نصائح أخرى

لك GLSurfaceView يتطلب أيضا setZOrderOnTop(true);

يمكنني استخدام فئة GLSurfaceView الخاصة بي لعرض المخططات (خلفية شفافة / تراكب). يتم تضمين My Extended GlsurfaceView عبر XML في نافذة Popover.

<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 بالنسبة إلى OpenGL في Android، سيظهر أن الصور الخلفية للأنشطة يتم رسمها كقوام OpenGL. لذلك بدلا من صنع GLSurfaceView شفافة، إن أمكن، يمكنك تقديم خلفياتك جيدا كملمس OpenGL في Glsurfaceview.
  2. أيضا، فإن قناة ألفا أو الشفافية على السطح ليست متطلبا قبل المزج ألفا في OpenGL. كلاهما مستقل.
  3. TextureView (الخدعة) هو بديل جيد إذا كان مكون OpenGL الخاص بك يتم تضمينه بين وجهات النظر الأخرى. هذه انطلق اللعبة مثال جيد جدا ل GLSurfaceView الرسم 2D في Android.

أدناه عينة مع تصميم 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. mearactive.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) شفافا، سيعرض الخلفية البيضاء للنشاط كخلفية.

يمكنك تعيين شفافية خلفية النشاط في Android.Manifest حيث يتم الإعلان عنها، راجع تطبيق API الرسمي Demo TransluctiveGhactivity للمساعدة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top