首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在GLSurfaceView上强制调用onDrawFrame()?

在GLSurfaceView上强制调用onDrawFrame()的方法是通过设置一个自定义的渲染器,并在渲染器中调用requestRender()方法来通知GLSurfaceView重新绘制。以下是一个简单的示例:

  1. 创建一个自定义的GLSurfaceView类:
代码语言:java
复制
public class MyGLSurfaceView extends GLSurfaceView {
    public MyGLSurfaceView(Context context) {
        super(context);
        setEGLContextClientVersion(2);
        setRenderer(new MyRenderer());
    }

    public void forceRedraw() {
        queueEvent(new Runnable() {
            @Override
            public void run() {
                MyRenderer renderer = (MyRenderer) getRenderer();
                if (renderer != null) {
                    renderer.requestRedraw();
                }
            }
        });
        requestRender();
    }
}
  1. 创建一个自定义的渲染器类:
代码语言:java
复制
public class MyRenderer implements GLSurfaceView.Renderer {
    private boolean mRedrawRequested = false;

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // 初始化渲染器
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // 调整视口大小
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // 绘制场景

        if (mRedrawRequested) {
            // 在这里执行需要在onDrawFrame()中执行的操作
            mRedrawRequested = false;
        }
    }

    public void requestRedraw() {
        mRedrawRequested = true;
    }
}
  1. 在需要强制调用onDrawFrame()的地方调用forceRedraw()方法:
代码语言:java
复制
MyGLSurfaceView myGLSurfaceView = (MyGLSurfaceView) findViewById(R.id.my_gl_surface_view);
myGLSurfaceView.forceRedraw();

这样,当调用forceRedraw()方法时,MyRenderer类中的requestRedraw()方法会被调用,标记mRedrawRequested为true,然后调用requestRender()方法通知GLSurfaceView重新绘制。在onDrawFrame()方法中,如果mRedrawRequested为true,则执行需要在onDrawFrame()中执行的操作,并将mRedrawRequested设置为false。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android开发笔记(一百五十三)OpenGL绘制三维图形的流程

从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发。...看起来OpenGL是很高大的样子,其实Android系统早已集成了相关的API,只要开发者按照函数要求依次调用,就能一步一步在手机屏幕上画出各式各样的三维物体了。...从前面的学习可以得知,每个Android界面上的控件,其实都是在某个视图上绘制规定的文字(TextView),或者绘制指定的图像(ImageView)。...具体到App编码上面,还得将GLSurfaceViewGLSurfaceView.Renderer和GL10这三个类有机结合起来,即通过函数调用关联它们三个小伙伴。...创建时调用,相当于自定义控件的构造函数,一样可在此进行三维绘图的初始化操作; 2、onSurfaceChanged函数在GLSurfaceView创建、恢复与改变时调用,在这里不但要定义三维空间的大小,

1.9K20
  • OpenGL ES 环境搭建

    在Android运行OpenGL ES程序需要用到GLSurfaceView控件,GLSurfaceView继承自SurfaceView并实现了GLThread,通过OpenGL ES进行绘制。...setRenderMode一定要在setRenderer方法之后调用,另外一般需要在Activity或者Fragment的onPause和onResume生命周期中调用GLSurfaceView的onPause...03 Renderer Renderer必须实现GLSurfaceView.Renderer接口,并实现onSurfaceCreated ,onDrawFrame,onSurfaceChanged方法,...onDrawFrame:执行OpenGL ES渲染工作,由系统以一定的频率来调用重绘View,当设置GLSurfaceView的渲染模式为GLSurfaceView.RENDERMODE_CONTINUOUSLY...或不设置时,系统就会主动回调onDrawFrame()方法, 如果设置为 RENDERMODE_WHEN_DIRTY ,手动调用requestRender(),才会渲染。

    92310

    Android GLSurfaceView绘制3D图像

    设置 Renderer: 创建一个实现了 GLSurfaceView.Renderer 接口的类,该接口包含三个方法:onSurfaceCreated、onSurfaceChanged 和 onDrawFrame...配置 EGLContext: 可以通过调用 GLSurfaceView 的 setEGLContextClientVersion 方法来设置 OpenGL ES 的版本,例如 2 或 3。...启动渲染: 通过调用 GLSurfaceView 的 setRenderer 方法来启动渲染过程。...glSurfaceView.onPause() } } 在这个示例中,我们创建了一个 MyGLRenderer 类来实现 GLSurfaceView.Renderer 接口,并在 onDrawFrame...OpenGL还是有点复杂,学了一阵子以后,没有再深入(给自己贴金了 实际是从入门到放弃了) END 点赞转发,让精彩不停歇!关注我们,评论区见,一起期待下期的深度好文!

    6210

    当Cocos2dx遇见Android,你猜猜

    下面我将通过演示如何在android端设置cocos2dx游戏界面的大小来说明cocos2dx引擎所运行的GLSurfaceView可以当成一个普通的view来使用。...该线程会不停的执行onDrawFrame这个方法,在onDrawFrame这个方法里我们可以看到它调用了Cocos2dxRenderer.nativeRender()这个native方法用来调用.so(...代码如下: public void onDrawFrame(final GL10 gl) { ......cocos2dx的node(游戏引擎中的节点概念)的update函数是运行在gl线程的,这个过程的根源是GLSurfaceViewonDrawFrame是在gl线程调用的,在onDrawFrame里会调用...()方法,在end方法里我们可以看到,它实际是修改一个主循环里的标志,从而让cocos2dx主循环退出,最后调用的还是exit(0),没错,就是exit(0),直接退出整个进程。

    1.9K20

    Android OpenGL ES入门

    OpenGL提供了一套标准的函数和接口,使开发人员能够在各种操作系统创建高性能的图形应用程序,这些操作系统包括Windows、Linux、macOS和一些嵌入式系统。...初始化OpenGL使用的类是GLSurfaceView,它可以处理OpenGL初始化过程中比较基本的操作,配置显示设备,在后台线程中渲染,渲染是在显示设备中一个称为surface的特定区域完成的。...会调用这个方法,这发生在应用程序第一次运行的时候,并且当设备被唤醒或者用户从其他Activity返回的时候也可能被调用,也就是说该方法可能被多次调用 onsurfaceChanged:每次surface...尺寸发生变化的时候,这个方法会被GLSurfaceView调用,横竖屏切换的时候尺寸会发生变化 onDrawFrame:当绘制一帧时,这个方法会被GLSurfaceView调用,在这个方法中,我们一定要绘制一些东西...,因为这个方法返回时,渲染缓冲区会被交换并显示在屏幕,如果什么都没有画,会看到糟糕的闪烁效果

    33610

    播放视频时如何在视频帧添加水印

    有同学可能会说了,我直接用TextureView渲染视频画面,然后在TextureView盖一层ImageView可以吗? 好像显示效果没有什么问题,但是仔细分析还是不能满足要求?...创建GL环境所在线程即为GL线程),绘制的工作直接通过OpenGL在绘制线程进行,不会阻塞主线程,绘制的结果输出到SurfaceView所提供的Surface,这使得GLSurfaceView也拥有了...GLSurfaceView提供了下列特性: 1.提供并且管理一个独立的Surface。 2.提供并且管理一个EGL display,它能让opengl把内容渲染到上述的Surface。...(Canvas canvas)使用Skia渲染引擎渲染,而GLSurfaceView的渲染器Renderer的onDrawFrame(GL10 gl)使用opengl绘制引擎进行渲染。...onDrawFrame绘制操作,将surfacetexture设置进播放器之后,codec中的surface会不断地被填充新的视频帧,在onDrawFrame中将视频帧surfaceTexture.updateTexImage

    3K00

    Android开发之OpenGL绘制2D图形的方法分析

    (1) abstract void onDrawFrame(GL 10 gl):Renerer对象调用该方法绘制GLSurviceView的当前帧。...(3) abstract void onDrawFrame(GL 10 gl,EGLConfig config):当GLSurfaceView被创建时回调该方法。 3....调用GLSurfaceView组件的setRebderer()方法指定Renderer对象,该Renderer对象将会完成GLSurfaceView里3D图像的绘制。...它就代表了GLOpenES的“绘制画笔”,我们可以把它想象成Swing 2D绘图中的Graphics,也可以想象成Android 2D绘图中的Canvas组件——当我们希望renderer绘制3D图形时,实际调用...GLSurfaceView的所有3D图形都是由Renderer的onDrawFrame(GL10 gl)方法绘制出来的,重写该方法时就要把所有3D图形都绘制出来,该方法通常以如下形式开始: public

    1K20

    【专业技术】Android平台下使用OpenGL

    而android平台下关于图像的现实,差不多都是由Surface来实现的 2、Renderer 有了GLSurfaceView之后,就相当于我们有了画图的纸。现在我们所需要做的就是如何在这张纸上画图。...Renderer是GLSurfaceView的内部静态接口,它就相当于在此GLSurfaceView作画的笔。我们通过实现这个接口来“作画”。...2.3 onDrawFrame 好了,我们的初始化工作做得差不多了,那么现在就是该真刀真枪画画的时候了!此函数就是真正给你画画用的。每调用一次就画一幅图。可能的疑问是这个函数什么时候会被调用呢?...当然是你要告诉它…… 调用GLSurfaceView的requestRender ()方法,告诉它,你脏了。 这两种模式在什么地方设置呢?...如何在平面上画三维坐标的点或图形呢?OpenGL有一个坐标系,如下图: ? 我们需要将这个坐标系和我们的GLSurfaceView里的Surface做一个映射关系。

    1.1K60

    Android OpenGL开发实践 - GLSurfaceView对摄像头数据的再处理

    在Surface第一次创建时也会调用。 public void onDrawFrame(GL10 glUnused) 此方法在渲染一帧图像时调用。...在任意时间调用GLSurfaceView的requestRender()方法后,GLSurfaceView会优先执行已保存在GL线程队列中的Runnable,然后调用onDrawFrame(GL10...GL线程队列中的所有Runnable和onDrawFrame方法的调用都执行在GL线程中。 另外,对于上面接口的调用时机,其实有两种方式可以触发onDrawFrame调用。...在用户调用GLSurfaceView.requestRender()方法时才会调用onDrawFrame刷新渲染;连续渲染则不依赖于用户调用,GL线程会每隔一段时间自动刷新渲染。...但是此时我们并不知道相机数据帧何时会更新到SurfaceTexture,也没有在GLSurfaceViewOnDrawFrame方法中将更新后的纹理渲染到屏幕,所以并不能在屏幕看到预览画面。

    12.9K124

    OpenGL ES for Android 相机预览

    权限 Android打开摄像头需要camera权限,在Android 6.0及以上的版本需要动态申请权限,在`AndroidManifest.xml`中添加camera权限: <manifest xmlns...mRenderer = MyRenderer(context = baseContext, listener = this) ... } ... } 当有新的一帧数据时会回调此方法,更新数据并调用...`glSurfaceView.requestRender()` 重新绘制,也就是重新调用Renderer的`onDrawFrame`方法。...index = shortArrayOf(3, 2, 0, 0, 1, 2) val indexBuffer = GLTools.array2Buffer(index) 绘制 override fun onDrawFrame...SurfaceTexture的方法)方法是异步的,也就是说无法知道这2个方法回调的前后顺序,因此需要保存相机权限状态cameraPermission和SurfaceTexture变量,在这2个回调中都调用打开相机方法

    99320
    领券