لرسم رسومات باستخدام OpenGL ES في تطبيق Android، يجب إنشاء
لعرض الحاوية لهم. وإحدى الطرق الأكثر وضوحًا للقيام بذلك هي تطبيق كل من
GLSurfaceView
وGLSurfaceView.Renderer
حاسمة
GLSurfaceView
هي حاوية عرض للرسومات المرسومة باستخدام OpenGL
ويتحكم GLSurfaceView.Renderer
في ما يتم رسمه ضمن طريقة العرض هذه. لمزيد من المعلومات
حول هذه الفئات، يمكنك مراجعة OpenGL ES
دليل المطوِّرين.
تُعد GLSurfaceView
طريقة واحدة فقط لدمج رسومات OpenGL ES في
التطبيق. بالنسبة إلى عرض الرسومات بملء الشاشة أو شبه الشاشة، يعد هذا اختيارًا معقولاً.
يجب على المطوّرين الذين يريدون دمج رسومات OpenGL ES في جزء صغير من تنسيقاتهم
مُمْكِنْ إِلْقَاءْ نَظْرَة عَلَى TextureView
. بالنسبة للمطورين الحقيقيين الذين يطورونهم بأنفسهم،
إنشاء عرض OpenGL ES باستخدام SurfaceView
، ولكن هذا يتطلب
وكتابة الكثير من التعليمات البرمجية الإضافية.
يشرح هذا الدرس كيفية إكمال عملية تنفيذ GLSurfaceView
وGLSurfaceView.Renderer
بطريقة بسيطة
نشاط التطبيق.
يُرجى توضيح استخدام OpenGL ES في البيان.
لكي يستخدم التطبيق واجهة برمجة التطبيقات OpenGL ES 2.0 API، يجب إضافة ما يلي: بيان خاص في بيان التطبيق:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
إذا كان التطبيق يستخدم ضغط البنية، يجب أيضًا تعريف تنسيقات الضغط. يتوافق مع تطبيقك، لكي يتم تثبيته على الأجهزة المتوافقة فقط.
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
لمزيد من المعلومات حول تنسيقات ضغط المادة، راجع دليل مطوّري برامج OpenGL.
إنشاء نشاط لرسومات OpenGL ES
تحتوي تطبيقات Android التي تستخدم OpenGL ES على أنشطة مثل أي تطبيق آخر له
واجهة مستخدم. الاختلاف الرئيسي عن التطبيقات الأخرى هو ما تضعه في تخطيط
الأخرى. بينما قد تستخدم في العديد من التطبيقات TextView
وButton
وListView
، في تطبيق يستخدم OpenGL ES، يمكنك تنفيذ ما يلي:
عليك أيضًا إضافة GLSurfaceView
.
يوضح مثال الرمز التالي الحد الأدنى من التنفيذ لأحد الأنشطة التي تستخدم
GLSurfaceView
كعرضه الأساسي:
Kotlin
class OpenGLES20Activity : Activity() { private lateinit var gLView: GLSurfaceView public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Create a GLSurfaceView instance and set it // as the ContentView for this Activity. gLView = MyGLSurfaceView(this) setContentView(gLView) } }
Java
public class OpenGLES20Activity extends Activity { private GLSurfaceView gLView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create a GLSurfaceView instance and set it // as the ContentView for this Activity. gLView = new MyGLSurfaceView(this); setContentView(gLView); } }
ملاحظة: يتطلب OpenGL ES 2.0 Android 2.2 (مستوى واجهة برمجة التطبيقات 8) أو إصدارًا أحدث، لذا، تأكَّد من أنّ مشروعك على Android يستهدف واجهة برمجة التطبيقات (API) هذه أو أعلى.
إنشاء كائن GLSurfaceView
GLSurfaceView
هو طريقة عرض متخصصة يمكنك من خلالها رسم OpenGL ES.
والرسومات.
وهي لا تفعل الكثير من تلقاء نفسها. يتم التحكم في الرسم الفعلي للكائنات من خلال
GLSurfaceView.Renderer
الذي ضبطته في طريقة العرض هذه في الواقع، التعليمات البرمجية لهذا
لكائن رفيع جدًا، فقد تميل إلى تخطي تمديده وإنشاء محتوى غير معدّل
مثال GLSurfaceView
، ولكن لا تفعل ذلك. تحتاج إلى تمديد هذا الصف في
من أجل التقاط أحداث اللمس، والتي تغطيها علامة الاستجابة للمس
الأحداث.
الرمز الأساسي لـ GLSurfaceView
هو رمز الحدّ الأدنى، لذلك للحصول على
التنفيذ، فمن الشائع
ما عليك سوى إنشاء فئة داخلية في النشاط الذي تستخدمه:
Kotlin
import android.content.Context import android.opengl.GLSurfaceView class MyGLSurfaceView(context: Context) : GLSurfaceView(context) { private val renderer: MyGLRenderer init { // Create an OpenGL ES 2.0 context setEGLContextClientVersion(2) renderer = MyGLRenderer() // Set the Renderer for drawing on the GLSurfaceView setRenderer(renderer) } }
Java
import android.content.Context; import android.opengl.GLSurfaceView; class MyGLSurfaceView extends GLSurfaceView { private final MyGLRenderer renderer; public MyGLSurfaceView(Context context){ super(context); // Create an OpenGL ES 2.0 context setEGLContextClientVersion(2); renderer = new MyGLRenderer(); // Set the Renderer for drawing on the GLSurfaceView setRenderer(renderer); } }
إنّ إضافة اختيارية أخرى إلى عملية تنفيذ GLSurfaceView
هي ضبط.
وضع العرض لرسم طريقة العرض فقط عندما يكون هناك تغيير في بيانات الرسم باستخدام
GLSurfaceView.RENDERMODE_WHEN_DIRTY
الإعداد:
Kotlin
// Render the view only when there is a change in the drawing data renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
Java
// Render the view only when there is a change in the drawing data setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
يؤدي هذا الإعداد إلى منع إعادة رسم إطار GLSurfaceView
حتى
الاتصال بـ requestRender()
، وهو أكثر
كفاءة لهذا التطبيق النموذجي.
إنشاء فئة عارض
يؤدي تنفيذ فئة GLSurfaceView.Renderer
، أو العارض،
داخل أحد التطبيقات التي تستخدم OpenGL ES هو المكان الذي تبدأ فيه الأمور لتصبح مثيرة للاهتمام. هذا الصف
عناصر التحكّم
ما يتم رسمه على GLSurfaceView
المرتبطة به. تتوفر
ثلاث طرق في عارض يستدعي نظام Android لمعرفة
طريقة الرسم على GLSurfaceView
:
onSurfaceCreated()
- تم استدعاء هذا الإجراء مرة واحدة لإعداد بيئة OpenGL ES في العرض.onDrawFrame()
- تم الاتصال لكل منهم إعادة رسم العرض.onSurfaceChanged()
- يتم الاتصال إذا يتغير الشكل الهندسي لطريقة العرض، على سبيل المثال عندما يتغير اتجاه شاشة الجهاز.
في ما يلي تنفيذ أساسي لعارض OpenGL ES الذي لا يفعل سوى رسم
خلفية سوداء في GLSurfaceView
:
Kotlin
import javax.microedition.khronos.egl.EGLConfig import javax.microedition.khronos.opengles.GL10 import android.opengl.GLES20 import android.opengl.GLSurfaceView class MyGLRenderer : GLSurfaceView.Renderer { override fun onSurfaceCreated(unused: GL10, config: EGLConfig) { // Set the background frame color GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f) } override fun onDrawFrame(unused: GL10) { // Redraw background color GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT) } override fun onSurfaceChanged(unused: GL10, width: Int, height: Int) { GLES20.glViewport(0, 0, width, height) } }
Java
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLES20; import android.opengl.GLSurfaceView; public class MyGLRenderer implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10 unused, EGLConfig config) { // Set the background frame color GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); } public void onDrawFrame(GL10 unused) { // Redraw background color GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); } public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); } }
هذا كل ما في الأمر! تُنشئ أمثلة التعليمات البرمجية أعلاه تطبيقًا بسيطًا لنظام التشغيل Android يعرض شاشة سوداء باستخدام OpenGL. على الرغم من أن هذه التعليمات البرمجية لا تفعل أي شيء مثير للاهتمام، إلا أنه من خلال أثناء إنشاء هذه الفصول، فقد وضعت الأساس الذي تحتاجه لبدء رسم العناصر الرسومية باستخدام OpenGL.
ملاحظة: قد تتساءل عن سبب توفُّر مَعلمة GL10
لهذه الطرق عند استخدام واجهات برمجة تطبيقات OpengGL ES 2.0.
تتم إعادة استخدام توقيعات الطرق هذه ببساطة مع واجهات برمجة التطبيقات 2.0 للاحتفاظ برمز إطار العمل في Android.
أكثر بساطة.
إذا كنت معتادًا على استخدام واجهات برمجة تطبيقات OpenGL ES، من المفترض أن تتمكّن الآن من إعداد OpenGL ES. بيئة في تطبيقك والبدء في رسم الرسومات. ومع ذلك، إذا كنت بحاجة إلى مزيد من المساعدة بدءًا من OpenGL، انتقل إلى الدروس التالية للحصول على مزيد من التلميحات.