Most visited

Recently visited

Added in API level 3

GLSurfaceView

public class GLSurfaceView
extends SurfaceView implements SurfaceHolder.Callback2

java.lang.Object
   ↳ android.view.View
     ↳ android.view.SurfaceView
       ↳ android.opengl.GLSurfaceView


SurfaceView的一个实现,它使用专用的曲面来显示OpenGL渲染。

GLSurfaceView提供以下功能:

Developer Guides

有关如何使用OpenGL的更多信息,请阅读 OpenGL开发人员指南。

Using GLSurfaceView

通常,您使用GLSurfaceView通过继承它并覆盖一个或多个View系统输入事件方法。 如果您的应用程序不需要重写事件方法,那么可以按原样使用GLSurfaceView。 大多数情况下,GLSurfaceView行为是通过调用“set”方法而不是通过子类来定制的。 例如,与常规View不同,绘图被委托给单独的Renderer对象,该对象使用setRenderer(Renderer)调用在GLSurfaceView中注册。

Initializing GLSurfaceView

All you have to do to initialize a GLSurfaceView is call setRenderer(Renderer). However, if desired, you can modify the default behavior of GLSurfaceView by calling one or more of these methods before calling setRenderer:

Specifying the android.view.Surface

By default GLSurfaceView will create a PixelFormat.RGB_888 format surface. If a translucent surface is required, call getHolder().setFormat(PixelFormat.TRANSLUCENT). The exact format of a TRANSLUCENT surface is device dependent, but it will be a 32-bit-per-pixel surface with 8 bits per component.

Choosing an EGL Configuration

A given Android device may support multiple EGLConfig rendering configurations. The available configurations may differ in how may channels of data are present, as well as how many bits are allocated to each channel. Therefore, the first thing GLSurfaceView has to do when starting to render is choose what EGLConfig to use.

默认情况下,GLSurfaceView选择一个具有RGB_888像素格式的EGLConfig,至少有一个16位深度缓冲区并且没有模板。

如果您更喜欢不同的EGLConfig,则可以通过调用setEGLConfigChooser方法之一来覆盖默认行为。

Debug Behavior

You can optionally modify the behavior of GLSurfaceView by calling one or more of the debugging methods setDebugFlags(int), and setGLWrapper(GLSurfaceView.GLWrapper). These methods may be called before and/or after setRenderer, but typically they are called before setRenderer so that they take effect immediately.

Setting a Renderer

Finally, you must call setRenderer(GLSurfaceView.Renderer) to register a GLSurfaceView.Renderer. The renderer is responsible for doing the actual OpenGL rendering.

Rendering Mode

Once the renderer is set, you can control whether the renderer draws continuously or on-demand by calling setRenderMode(int). The default is continuous rendering.

Activity Life-cycle

A GLSurfaceView must be notified when the activity is paused and resumed. GLSurfaceView clients are required to call onPause() when the activity pauses and onResume() when the activity resumes. These calls allow GLSurfaceView to pause and resume the rendering thread, and also allow GLSurfaceView to release and recreate the OpenGL display.

Handling events

要处理事件,您通常会继承GLSurfaceView并覆盖相应的方法,就像您使用其他视图一样。 但是,在处理事件时,可能需要与渲染线程中运行的Renderer对象进行通信。 您可以使用任何标准的Java跨线程通信机制来执行此操作。 另外,与您的渲染器进行通信的一种相对简单的方法是致电queueEvent(Runnable) 例如:

 class MyGLSurfaceView extends GLSurfaceView {

     private MyRenderer mMyRenderer;

     public void start() {
         mMyRenderer = ...;
         setRenderer(mMyRenderer);
     }

     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
             queueEvent(new Runnable() {
                 // This method will be called on the rendering
                 // thread:
                 public void run() {
                     mMyRenderer.handleDpadCenter();
                 }});
             return true;
         }
         return super.onKeyDown(keyCode, event);
     }
 }
 

Summary

Nested classes

interface GLSurfaceView.EGLConfigChooser

用于从潜在配置列表中选择EGLConfig配置的接口。

interface GLSurfaceView.EGLContextFactory

用于自定义eglCreateContext和eglDestroyContext调用的接口。

interface GLSurfaceView.EGLWindowSurfaceFactory

用于自定义eglCreateWindowSurface和eglDestroySurface调用的接口。

interface GLSurfaceView.GLWrapper

用于包装GL界面的界面。

interface GLSurfaceView.Renderer

一个通用的渲染器接口。

Inherited XML attributes

From class android.view.View

Constants

int DEBUG_CHECK_GL_ERROR

每次GL调用后检查glError(),如果glError指示发生了错误,则抛出异常。

int DEBUG_LOG_GL_CALLS

Log GL使用标记“GLSurfaceView”以“详细”级别调用系统日志。

int RENDERMODE_CONTINUOUSLY

渲染器被连续调用以重新渲染场景。

int RENDERMODE_WHEN_DIRTY

渲染器仅在创建曲面时或调用 requestRender()requestRender()

Inherited constants

From class android.view.View

Inherited fields

From class android.view.View

Public constructors

GLSurfaceView(Context context)

标准视图构造函数。

GLSurfaceView(Context context, AttributeSet attrs)

标准视图构造函数。

Public methods

int getDebugFlags()

获取调试标志的当前值。

boolean getPreserveEGLContextOnPause()
int getRenderMode()

获取当前的渲染模式。

void onPause()

通知活动已暂停的视图。

void onResume()

通知活动已恢复的观点。

void queueEvent(Runnable r)

排队可运行在GL渲染线程上运行。

void requestRender()

请求渲染器渲染一个帧。

void setDebugFlags(int debugFlags)

将调试标志设置为新值。

void setEGLConfigChooser(boolean needDepth)

安装一个配置选择器,它将选择一个尽可能接近16位RGB的配置,带或不带可选深度缓冲区,尽可能接近16位。

void setEGLConfigChooser(GLSurfaceView.EGLConfigChooser configChooser)

安装一个自定义的EGLConfigChooser。

void setEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize)

安装一个配置选择器,它将选择至少具有指定的depthSize和stencilSize的配置,以及指定的redSize,greenSize,blueSize和alphaSize。

void setEGLContextClientVersion(int version)

通知默认的EGLContextFactory和默认的EGLConfigChooser,其中EGLContext客户端版本要选择。

void setEGLContextFactory(GLSurfaceView.EGLContextFactory factory)

安装一个自定义的EGLContextFactory。

void setEGLWindowSurfaceFactory(GLSurfaceView.EGLWindowSurfaceFactory factory)

安装一个自定义的EGLWindowSurfaceFactory。

void setGLWrapper(GLSurfaceView.GLWrapper glWrapper)

设置glWrapper。

void setPreserveEGLContextOnPause(boolean preserveOnPause)

控制GLSurfaceView暂停和恢复时是否保留EGL上下文。

void setRenderMode(int renderMode)

设置渲染模式。

void setRenderer(GLSurfaceView.Renderer renderer)

设置与此视图关联的渲染器。

void surfaceChanged(SurfaceHolder holder, int format, int w, int h)

此方法是SurfaceHolder.Callback接口的一部分,通常不会由GLSurfaceView的客户端调用或分类。

void surfaceCreated(SurfaceHolder holder)

此方法是SurfaceHolder.Callback接口的一部分,通常不会由GLSurfaceView的客户端调用或分类。

void surfaceDestroyed(SurfaceHolder holder)

此方法是SurfaceHolder.Callback接口的一部分,通常不会由GLSurfaceView的客户端调用或分类。

void surfaceRedrawNeeded(SurfaceHolder holder)

此方法是SurfaceHolder.Callback接口的一部分,通常不会由GLSurfaceView的客户端调用或分类。

Protected methods

void finalize()

当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。

void onAttachedToWindow()

此方法用作View类的一部分,通常不会被GLSurfaceView的客户端调用或分类。

void onDetachedFromWindow()

这是在视图从窗口分离时调用的。

Inherited methods

From class android.view.SurfaceView
From class android.view.View
From class java.lang.Object
From interface android.graphics.drawable.Drawable.Callback
From interface android.view.KeyEvent.Callback
From interface android.view.accessibility.AccessibilityEventSource
From interface android.view.SurfaceHolder.Callback2
From interface android.view.SurfaceHolder.Callback

Constants

DEBUG_CHECK_GL_ERROR

Added in API level 3
int DEBUG_CHECK_GL_ERROR

每次GL调用后检查glError(),如果glError指示发生了错误,则抛出异常。 这可以用来帮助追踪哪些OpenGL ES调用导致错误。

也可以看看:

常数值:1(0x00000001)

DEBUG_LOG_GL_CALLS

Added in API level 3
int DEBUG_LOG_GL_CALLS

Log GL使用标记“GLSurfaceView”以“详细”级别调用系统日志。

也可以看看:

常量值:2(0x00000002)

RENDERMODE_CONTINUOUSLY

Added in API level 3
int RENDERMODE_CONTINUOUSLY

渲染器被连续调用以重新渲染场景。

也可以看看:

常数值:1(0x00000001)

RENDERMODE_WHEN_DIRTY

Added in API level 3
int RENDERMODE_WHEN_DIRTY

渲染器仅在创建曲面时 requestRender()调用 requestRender()requestRender()

也可以看看:

常量值:0(0x00000000)

Public constructors

GLSurfaceView

Added in API level 3
GLSurfaceView (Context context)

标准视图构造函数。 为了渲染东西,您必须调用setRenderer(GLSurfaceView.Renderer)来注册渲染器。

Parameters
context Context

GLSurfaceView

Added in API level 3
GLSurfaceView (Context context, 
                AttributeSet attrs)

标准视图构造函数。 为了渲染东西,您必须调用setRenderer(GLSurfaceView.Renderer)来注册渲染器。

Parameters
context Context
attrs AttributeSet

Public methods

getDebugFlags

Added in API level 3
int getDebugFlags ()

获取调试标志的当前值。

Returns
int the current value of the debug flags.

getPreserveEGLContextOnPause

Added in API level 11
boolean getPreserveEGLContextOnPause ()

Returns
boolean true if the EGL context will be preserved when paused

getRenderMode

Added in API level 3
int getRenderMode ()

获取当前的渲染模式。 可以从任何线程调用。 在设置渲染器之前不得调用。

Returns
int the current rendering mode.

也可以看看:

onPause

Added in API level 3
void onPause ()

通知活动已暂停的视图。 该视图的所有者必须在活动暂停时调用此方法。 调用这个方法会暂停渲染线程。 在设置渲染器之前不得调用。

onResume

Added in API level 3
void onResume ()

通知活动已恢复的观点。 该视图的所有者必须在活动恢复时调用此方法。 调用此方法将重新创建OpenGL显示并恢复渲染线程。 在设置渲染器之前不得调用。

queueEvent

Added in API level 3
void queueEvent (Runnable r)

排队可运行在GL渲染线程上运行。 这可以用于在渲染线程上与渲染器通信。 在设置渲染器之前不得调用。

Parameters
r Runnable: the runnable to be run on the GL rendering thread.

requestRender

Added in API level 3
void requestRender ()

请求渲染器渲染一个帧。 当渲染模式设置为RENDERMODE_WHEN_DIRTY时通常使用此方法,以便仅在需要时渲染帧。 可以从任何线程调用。 在设置渲染器之前不得调用。

setDebugFlags

Added in API level 3
void setDebugFlags (int debugFlags)

将调试标志设置为新值。 该值由0或0以上的DEBUG_CHECK_ *常量构成。 每当创建表面时,调试标志都会生效。 默认值为零。

Parameters
debugFlags int: the new debug flags

也可以看看:

setEGLConfigChooser

Added in API level 3
void setEGLConfigChooser (boolean needDepth)

安装一个配置选择器,它将选择一个尽可能接近16位RGB的配置,带或不带可选深度缓冲区,尽可能接近16位。

如果调用此方法,则必须在调用 setRenderer(Renderer)之前调用该方法。

如果未调用setLCLConfigChooser方法,则默认情况下视图将选择深度缓冲区深度至少为16位的RGB_888表面。

setEGLConfigChooser

Added in API level 3
void setEGLConfigChooser (GLSurfaceView.EGLConfigChooser configChooser)

安装一个自定义的EGLConfigChooser。

如果调用此方法,则必须在调用 setRenderer(Renderer)之前调用该方法。

如果没有调用setLCLConfigChooser方法,那么在默认情况下,视图将选择与当前android.view.Surface兼容的EGLConfig,其深度缓冲深度至少为16位。

setEGLConfigChooser

Added in API level 3
void setEGLConfigChooser (int redSize, 
                int greenSize, 
                int blueSize, 
                int alphaSize, 
                int depthSize, 
                int stencilSize)

安装一个配置选择器,它将选择至少具有指定的depthSize和stencilSize的配置,以及指定的redSize,greenSize,blueSize和alphaSize。

如果调用此方法,则必须在调用 setRenderer(Renderer)之前调用该方法。

如果未调用setLCLConfigChooser方法,则默认情况下视图将选择深度缓冲区深度至少为16位的RGB_888表面。

Parameters
redSize int
greenSize int
blueSize int
alphaSize int
depthSize int
stencilSize int

setEGLContextClientVersion

Added in API level 8
void setEGLContextClientVersion (int version)

通知默认的EGLContextFactory和默认的EGLConfigChooser,其中EGLContext客户端版本要选择。

使用此方法创建一个OpenGL ES 2.0兼容的上下文。 例:

     public MyView(Context context) {
         super(context);
         setEGLContextClientVersion(2); // Pick an OpenGL ES 2.0 context.
         setRenderer(new MyRenderer());
     }
 

注意:需要OpenGL ES 2.0的活动应该通过在活动的AndroidManifest.xml文件中设置@lt; uses-feature android:glEsVersion =“0x00020000”/>来指明。

如果调用此方法,则必须在调用 setRenderer(Renderer)之前调用此方法。

此方法仅影响默认EGLContexFactory和默认EGLConfigChooser的行为。 如果setEGLContextFactory(EGLContextFactory)已被调用,则供给EGLContextFactory负责创建一个OpenGL ES 2.0兼容的上下文。 如果setEGLConfigChooser(EGLConfigChooser)已被调用,则提供的EGLConfigChooser负责选择OpenGL ES 2.0兼容的配置。

Parameters
version int: The EGLContext client version to choose. Use 2 for OpenGL ES 2.0

setEGLContextFactory

Added in API level 5
void setEGLContextFactory (GLSurfaceView.EGLContextFactory factory)

安装一个自定义的EGLContextFactory。

如果调用此方法,则必须在调用 setRenderer(Renderer)之前调用该方法。

如果未调用此方法,那么默认情况下将创建一个没有共享上下文并具有空属性列表的上下文。

Parameters
factory GLSurfaceView.EGLContextFactory

setEGLWindowSurfaceFactory

Added in API level 5
void setEGLWindowSurfaceFactory (GLSurfaceView.EGLWindowSurfaceFactory factory)

安装一个自定义的EGLWindowSurfaceFactory。

如果调用此方法,则必须在调用 setRenderer(Renderer)之前调用该方法。

如果此方法未被调用,则默认情况下将使用空属性列表创建窗口表面。

Parameters
factory GLSurfaceView.EGLWindowSurfaceFactory

setGLWrapper

Added in API level 3
void setGLWrapper (GLSurfaceView.GLWrapper glWrapper)

设置glWrapper。 如果glWrapper不为null,则在创建表面时调用其wrap(GL)方法。 GLWrapper可以用来包装传递给渲染器的GL对象。 包装GL对象可以检查和修改由渲染器进行的GL调用的行为。

包装通常用于调试目的。

默认值为空。

Parameters
glWrapper GLSurfaceView.GLWrapper: the new GLWrapper

setPreserveEGLContextOnPause

Added in API level 11
void setPreserveEGLContextOnPause (boolean preserveOnPause)

控制GLSurfaceView暂停和恢复时是否保留EGL上下文。

如果设置为true,那么当GLSurfaceView暂停时,可以保留EGL上下文。 EGL上下文是否实际保留取决于程序运行的Android设备是否可以支持任意数量的EGL上下文。 只能支持有限数量的EGL上下文的设备必须释放EGL上下文以允许多个应用程序共享GPU。

如果设置为false,则在GLSurfaceView暂停时释放EGL上下文,并在GLSurfaceView恢复时重新创建。

默认值是false。

Parameters
preserveOnPause boolean: preserve the EGL context when paused

setRenderMode

Added in API level 3
void setRenderMode (int renderMode)

设置渲染模式。 当renderMode为RENDERMODE_CONTINUOUSLY时,将重复调用渲染器以重新渲染场景。 renderMode为RENDERMODE_WHEN_DIRTY时,渲染器仅在创建曲面时或调用requestRender()requestRender() 默认为RENDERMODE_CONTINUOUSLY。

使用RENDERMODE_WHEN_DIRTY可以在不需要更新视图时允许GPU和CPU闲置,从而延长电池寿命和整体系统性能。

此方法只能在 setRenderer(Renderer)setRenderer(Renderer)

Parameters
renderMode int: one of the RENDERMODE_X constants

也可以看看:

setRenderer

Added in API level 3
void setRenderer (GLSurfaceView.Renderer renderer)

设置与此视图关联的渲染器。 还会启动将调用渲染器的线程,这又会导致渲染开始。

这个方法应该在GLSurfaceView的生命周期中只调用一次。

以下GLSurfaceView方法只能在调用setRenderer 之前调用:

以下GLSurfaceView方法只能在调用setRenderer 调用:

Parameters
renderer GLSurfaceView.Renderer: the renderer to use to perform OpenGL drawing.

surfaceChanged

Added in API level 3
void surfaceChanged (SurfaceHolder holder, 
                int format, 
                int w, 
                int h)

此方法是SurfaceHolder.Callback接口的一部分,通常不会由GLSurfaceView的客户端调用或分类。

Parameters
holder SurfaceHolder: The SurfaceHolder whose surface has changed.
format int: The new PixelFormat of the surface.
w int: The new width of the surface.
h int: The new height of the surface.

surfaceCreated

Added in API level 3
void surfaceCreated (SurfaceHolder holder)

此方法是SurfaceHolder.Callback接口的一部分,通常不会由GLSurfaceView的客户端调用或分类。

Parameters
holder SurfaceHolder: The SurfaceHolder whose surface is being created.

surfaceDestroyed

Added in API level 3
void surfaceDestroyed (SurfaceHolder holder)

此方法是SurfaceHolder.Callback接口的一部分,通常不会由GLSurfaceView的客户端调用或分类。

Parameters
holder SurfaceHolder: The SurfaceHolder whose surface is being destroyed.

surfaceRedrawNeeded

Added in API level 24
void surfaceRedrawNeeded (SurfaceHolder holder)

此方法是SurfaceHolder.Callback接口的一部分,通常不会由GLSurfaceView的客户端调用或分类。

Parameters
holder SurfaceHolder: The SurfaceHolder whose surface has changed.

Protected methods

finalize

Added in API level 3
void finalize ()

当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 子类会覆盖finalize方法以处置系统资源或执行其他清理。

finalize的一般合同是,如果当Java TM虚拟机已经确定不再有任何途径可以通过任何还没有死亡的线程访问该对象时,除了作为动作的结果之外取决于某些其他可以完成的对象或类别的最终定稿。 finalize方法可以采取任何行动,包括使该对象再次可用于其他线程; 然而, finalize的通常目的是在对象被不可撤销地丢弃之前执行清理操作。 例如,表示输入/输出连接的对象的finalize方法可能会执行显式I / O事务,以在永久丢弃该对象之前中断连接。

Objectfinalize方法Object执行特殊操作; 它只是正常返回。 Object子类可以覆盖此定义。

Java编程语言不保证哪个线程将为任何给定对象调用finalize方法。 但是,保证调用finalize的线程在调用finalize时不会保留任何用户可见的同步锁。 如果finalize方法引发未捕获的异常,则忽略该异常,并终止该对象的终止。

在为某个对象调用 finalize方法之后,在Java虚拟机再次确定不再有任何方法可以通过尚未死亡的任何线程访问此对象,包括可能的操作通过准备完成的其他对象或类别,此时该对象可能被丢弃。

对于任何给定的对象,Java虚拟机从不会多次调用 finalize方法。

finalize方法引发的任何异常 finalize导致终止此对象的终止,但会被忽略。

Throws
Throwable

onAttachedToWindow

Added in API level 3
void onAttachedToWindow ()

此方法用作View类的一部分,通常不会被GLSurfaceView的客户端调用或分类。

onDetachedFromWindow

Added in API level 3
void onDetachedFromWindow ()

这是在视图从窗口分离时调用的。 此时它不再有绘图表面。

Hooray!