Android OpenGL ES خلفية شفافة
-
19-09-2019 - |
سؤال
أنا بناء تطبيق أندرويد يستفيد من 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
, ، النظر في النقاط السلبية التالية.
- يتطلب تمكين الشفافية التي تستخدمها
setZOrderOnTop
علىGLSurfaceView
. وبعد من شأنها أن تمنعك من وضع أي آراء أخرى (على سبيل المثالTextView
) على رأسك شفافةGLSurfaceView
. وبعد حتى أدراج الملاحة لا يمكن أن تنزلق فوق شفافةGLSurfaceView
(تجاهل الخدع ). شفافة أم لا،GLSurfaceView
يمكن أن تكون موجودة فقط فوق أو أسفل طرق عرض Android الأخرى وليس بينهما. - يتطلب الشفافية التي تستخدمها
setEGLConfigChooser
وsetFormat
كما هو الحال في المثال. هذا يعني أنه لا يمكنك الحصول على التنسيق الافتراضي الذي تم اختياره بواسطة النظام الذي كان سيكون الأفضل لهذا الجهاز بالذات. الأهم من ذلك، ستحتاج إلى التأكد من أن الجهاز يحتوي على التنسيق المدعوم واختار البدائل إذا كان التنسيق المتوقع غير موجود كما هو الحال في هذا GSOC مثال.
خيارات أخرى للشفافية.
- ادارة
Tracer
بالنسبة إلى OpenGL في Android، سيظهر أن الصور الخلفية للأنشطة يتم رسمها كقوام OpenGL. لذلك بدلا من صنعGLSurfaceView
شفافة، إن أمكن، يمكنك تقديم خلفياتك جيدا كملمس OpenGL في Glsurfaceview. - أيضا، فإن قناة ألفا أو الشفافية على السطح ليست متطلبا قبل المزج ألفا في OpenGL. كلاهما مستقل.
TextureView
(الخدعة) هو بديل جيد إذا كان مكون OpenGL الخاص بك يتم تضمينه بين وجهات النظر الأخرى. هذه انطلق اللعبة مثال جيد جدا لGLSurfaceView
الرسم 2D في Android.
أدناه عينة مع تصميم XML ورمز للشفافية GLSurfaceView
مع الخلفية.
تخطيط ملف 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>
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 للمساعدة