标签: glsurfaceview

没有setZOrderonTop的Android GLSurfaceView透明背景

对不起我的英语不好.

我的工作基于https://github.com/harism/android_page_curl/

经过几个小时的研究,我找到了一些解决方案,但不是我在申请中遇到的所有问题.我在使用GLSurfaceView时遇到了一些麻烦.我有一个背景,有一个relativeLayout,一个GLSurfaceView和一个叠加在上面.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/background"
    android:layout_width="match_parent"
    android:background="@layout/backgroundrepeat"
    android:layout_height="match_parent">
<com.m2y.foxprez.view.CurlView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/openglview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

当我开始我的观点时:

setEGLConfigChooser(8,8,8,8,16,0);
setRenderer(renderer);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setZOrderMediaOverlay(true);
Run Code Online (Sandbox Code Playgroud)

在我的渲染器中:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0f, 0f, 0f, 0f);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);
    gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
    gl.glEnable(GL10.GL_LINE_SMOOTH);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glDisable(GL10.GL_CULL_FACE);
}

public synchronized void onDrawFrame(GL10 gl) {
    gl.glClearColor(0f,0f,0f,0f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    gl.glLoadIdentity();
}
Run Code Online (Sandbox Code Playgroud)

经过多次研究,我目前被阻止了这个结果:
使用setZOrderOnTop,我有背景,但叠加层在视图下.
使用setZOrderMediaOverlay,我有叠加层,但背景为黑色.

有人可以帮帮我吗?

android opengl-es glsurfaceview android-relativelayout

12
推荐指数
1
解决办法
1万
查看次数

与SurfaceView,Camera和OpenGL战斗

我们一直在与SurfaceViews相关的一些问题进行斗争一个多星期,并找不到合适的解决方案.我们在论坛中阅读了有关类似问题的其他问题(甚至是Mixare源代码)但找不到答案,所以我们希望您能以某种方式帮助我们.

场景:我们有

  • 用于相机的SurfaceView
  • 用于OpenGL图层的SurfaceView,它位于相机顶部.
  • 另一个视图,显示有关我们在屏幕上可以看到的内容的一些信息.这个是在两个SurfaceViews之上.

问题:

无论我们如何努力,两个SurfaceViews显然都不能相处得很好.如果我们试图:

setContentView(mCameraPreview); 
addContentView(mGLSurfaceView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Run Code Online (Sandbox Code Playgroud)

(这似乎合乎逻辑),一切都按预期进行,直到我们锁定/解锁手机.之后,GLSurfaceView就会消失(不是InfoView,仍会显示).

相反,如果我们尝试:

setContentView(mGLSurfaceView); 
addContentView(mCameraPreview, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Run Code Online (Sandbox Code Playgroud)

然后问题是GLSurfaceView仅在锁定/解锁后出现,在此之前屏幕显示相机和InfoView.

我们发现,如果我们在显示视图的活动中执行onStart()之后将主线程休眠4.6秒(或更多),则行为与预期一致(即使在锁定/解锁后,也会显示相机,glsurface和info视图).

问题是,我们正在寻找更优雅的解决方案.

在我们看来,问题是相机花费的时间比预期的多Camera.open(),因此添加了相机视图,添加了GLSurfaceView,当相机实际打开时,它会在GLSurfaceView的顶部打开.关于这一点,我们bringToFront()在GLSurfaceView上使用了它,并将其放在信息视图的顶部,但是在锁定/解锁后,相机仍然在其上面打开,只留下一个带有摄像头预览的屏幕.

有任何想法吗?我们如何在它们之上显示SurfaceViews和信息视图?

android opengl-es surfaceview glsurfaceview

11
推荐指数
2
解决办法
6938
查看次数

Android:将OpenGL效果应用于相机

Android中是否有任何方法可以使用GLSurfaceView显示相机预览,同时在该表面上使用OpenGL效果?特别是加成混合效果.我知道OpenGL可以使用这些效果,我知道相机可以放在SurfaceView上,但是可以将相机放在GLSurfaceView中并将OpenGL混合效果应用于相机预览吗?

camera android opengl-es color-blending glsurfaceview

11
推荐指数
1
解决办法
4519
查看次数

具有透明背景的OpenGL场景+下方和上方的本机小部件

我正在尝试实现以下视图:

在此输入图像描述

如果视图是分层的(从下到上):

  • 第1层:基本的XML布局(图像,按钮等)
  • 第2层:具有透明背景的OpenGL场景,以便我们可以看透
  • 第3层:OpenGL场景中的一些小部件(即TextView)

我已经使用GLSurfaceViewTextureView沿着这些线路,都没有成功.我可以将不透明度设置为曲面,但整个视图变为半透明,并且setZOrderOnTop必须设置为true,因此没有窗口小部件可以存在于顶部.我也试过rajawali3d,结果相同

这可以实现吗?使用股票查看?还是图书馆?

更新:也试过JPCT-AE,结果相同.

更新2:似乎有一种方法UnityPlayer可以在使用a时使用浮动OpenGL视图SurfaceView,但在较新的SDK中不再是这种情况.

transparency android glsurfaceview opengl-es-2.0 textureview

11
推荐指数
0
解决办法
310
查看次数

尽管改变渲染模式,GLSurfaceView仍会不断渲染

我正在尝试创建一个显示游戏区域地图的GLSurfaceView.当玩家移动时,游戏活动会调用highlightSpot,而后者又会触发渲染请求.我想重新绘制视图的唯一时间是玩家移动时.

然而,在我当前的实现中,尽管调用setRenderMode(RENDERMODE_WHEN_DIRTY)了我的GLSurfaceView,但它的渲染模式似乎仍然是连续的.为了检查,我在我的onDrawFrame方法中抛出了一个println语句,当我运行我的应用程序时,输出很快就会填满我的logcat,而玩家甚至不会移动一次 - 它显然不符合我的预期.还有什么我需要做的才能在被问到时才进行视图渲染吗?

(此代码的大部分内容来自http://insanitydesign.com/wp/projects/nehe-android-ports/上的教程.为了简洁起见,我省略了我的onDrawFrame,OnSurfaceChanged和onSurfaceCreated方法,因为我是不改变渲染模式或在这些方法中的任何地方请求渲染.如果有人认为它可能是相关的,我也可以发布它们.)

public class SurfaceViewClass extends GLSurfaceView implements Renderer {
    public SurfaceViewClass(Context context) {
        super(context);

        ...

        this.setRenderer(this);
        this.setRenderMode(RENDERMODE_WHEN_DIRTY);
    }

    public void highlightSpot(int x, int y) {
        /* change some variables here */
        ...

        this.requestRender();
    }
}
Run Code Online (Sandbox Code Playgroud)

android opengl-es glsurfaceview

9
推荐指数
1
解决办法
8505
查看次数

如何在具有透明背景的glSurfaceView顶部放置视图?

我的应用程序由图像背景组成(从后到前),然后是包含3D对象和前2个按钮的glSurfaceView.我希望GLSurfaceView的背景是透明的,并看到背后的图像.

我尝试了两种解决方案,但没有一种令人满意:

mGLSurfaceView = new GLSurfaceView(mContext);
mGLSurfaceView.setEGLContextClientVersion(2);           
mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
mGLSurfaceView.setZOrderOnTop(true);
mGLSurfaceView.setRenderer(mRenderer);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以看到背景,但3D对象浮动在所有其他布局的顶部,有时隐藏按钮.

mGLSurfaceView = new GLSurfaceView(mContext);
mGLSurfaceView.setEGLContextClientVersion(2);           
mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
mGLSurfaceView.setZOrderMediaOverlay(true);
mGLSurfaceView.setRenderer(mRenderer);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以看到按钮,但GLSurfaceView不再透明,我看不到图像背景.我已经解析了所有其他主题,但没有一个给我任何令人满意的答案.

3d android overlay renderer glsurfaceview

9
推荐指数
1
解决办法
2333
查看次数

Android View与SurfaceView相比,GLSurfaceView适用于具有Zoomable用户界面的2D绘图应用

我打算用可缩放的用户界面编写一个2D绘图应用程序.使用该应用程序,用户应该能够转换(平移和缩放)绘制的路径(当然还有UI).我假设同时会有多达500个路径.现在,我想知道从哪个视图开始(View,SurfaceView或GLSurfaceView)以提供可接受的性能.我阅读了几篇帖子[1-6],包括曾经在Android上的开发者指南,我仍然不能100%确定使用哪个视图.

根据Google I/O 2009(http://youtu.be/U4Bk5rmIpic?t=45m10s)上的演示文稿和自己的体验,在处理100多个路径时,canvas(View和SurfaceView)似乎没有足够快的性能.

有没有人看到使用画布实现应用程序的可能性或OpenGL的方式去?

[1] Android:在SurfaceView和OpenGL之间做出决定(GLSurfaceView)

[2] SurfaceView或GLSurfaceview?

[3] SurfaceView和View之间的区别?

[4] http://pierrchen.blogspot.jp/2014/03/anroid-graphics-surfaceview-all-you.html

[5] SurfaceView和ImageView之间的区别

[6] Android中SurfaceView和GLSurfaceView之间的区别

android opengl-es surfaceview glsurfaceview android-view

9
推荐指数
1
解决办法
3183
查看次数

调整大小和恢复/暂停 GLSurfaceView 时出现问题

GLSurfaceView在我的应用程序中使用,最近在调整它的大小时发现了一个奇怪的行为。最后,我找出了导致我的应用程序出现问题的原因,并创建了一个简单的示例来重现它。

假设我们有一个FrameLayout包含 simple GLSurfaceView. 在每次点击时,GLSurfaceView我们使用以下代码更改其高度

CyclicIterator<Integer> iterator = CyclicIterator.from(200, 300, 500);
glView.setOnClickListener(v -> {
    glView.getLayoutParams().height = sizeIterator.next();
    glView.requestLayout();
});
Run Code Online (Sandbox Code Playgroud)

一切顺利,直到我们在后台快速移动应用程序,然后使用“概览”按钮(类似于“猴子测试”)返回到前台。如果我们足够快地在背景/前景之间切换并再次调整视图大小,我们最终可能会遇到以下情况:表面内出现一个“死”区域,直到我们再次停止/开始活动它才会更新。

glGetError在每次 gl 调用后都检查过,没有收到任何错误。同时我收到了正确的widthheightonSurfaceChanged回调。

我尝试重现此行为并在 Nexus 5X 和小米红米 6A 上获得相同的结果。

更多细节

GLSurfaceView 配置为:

glView.setEGLContextClientVersion(2);
glView.setRenderer(new Renderer() {
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
    }

    @Override …
Run Code Online (Sandbox Code Playgroud)

lifecycle android opengl-es glsurfaceview

9
推荐指数
0
解决办法
85
查看次数

为什么在OpenGLES中glClear阻塞?

我正试图描绘我的渲染器,我看到一些奇怪的剖析行为,我无法解释.

我正在使用glSurfaceView,我已设置连续渲染.

这就是我onDrawFrame()的结构

public void onDrawFrame(GL10 unused) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
    executeAllDrawCommands();
}
Run Code Online (Sandbox Code Playgroud)

这在轻负载下表现得很慢,所以我创建了一个计时器类并开始对其进行分析.我看到的东西让我很惊讶.

我对onDrawFrame方法进行了一些探测,如下所示:

public void onDrawFrame(GL10 unused) {
   swapTimer.end();

   clearTimer.start();
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
   clearTimer.end();

   drawTimer.start();
     executeAllDrawCommands();
   drawTimer.end();

   swapTimer.start();
}
Run Code Online (Sandbox Code Playgroud)

clearTimer测量调用glClear所需的时间,drawTimer测量运行所有绘制调用swapTimer所需的时间,并测量onDrawFrame退出和返回时的时间(调用eglSwapBuffers所需的时间).

当我跑一个非常轻载的场景时,我得到了一些我无法解释的奇怪数字:

swapTimer  : 20ms (average)
clearTimer : 11ms (average)
drawTimer  :  2ms (average)
Run Code Online (Sandbox Code Playgroud)

我预计交换时间有点大,因为我相信设备在~30fps时有vsync强制启用,但我不知道为什么实际的"清除"调用阻塞了11毫秒?我以为它应该发出一个异步命令并返回?

当我绘制一个更繁忙的场景时,数字会发生很大变化:

swapTimer  :  2ms (average)
clearTimer :  0ms (average)
drawTimer  : 44ms (average)
Run Code Online (Sandbox Code Playgroud)

在这个场景中,我的绘制调用花了很多时间,看起来它隐藏了很多vsync周期,并且清除调用上的块完全消失了.

有什么解释为什么glClear在我轻载的场景上阻挡了?

链接到我的'Timer'类源代码,以防有人怀疑我的测量技术:http://pastebin.com/bhXt368W

android opengl-es glsurfaceview opengl-es-2.0

8
推荐指数
1
解决办法
4697
查看次数

在GLSurfaceView上绘制Android UI

对于我的游戏,我正在考虑在我GLSurfaceView使用RelativeLayout的基础上绘制UI元素(TextView用于显示已用时间,按钮用于暂停/重新开始游戏)...

直到现在,我自己直接将所有UI元素绘制到surfaceView,但考虑到Android UI提供的广泛选项(如更改字体和颜色的字体),我决定使用它.

问题:

  • 在上面绘制UI元素GLSurfaceView或者直接绘制所有UI内容是否更好GLSurfaceView
  • 我将TextView通过使用runOnUiThread()方法定期更新UI元素(Say )的内容(每16毫秒)...这是不是很糟糕?
  • 我的游戏是否会受到Force Closes的影响?

这是测试java代码,我用它来设置RelativeLayout ... glViewGLSurfaceView实例.

    rl = new RelativeLayout(this);
    rl.addView(glView);        
    tv = new TextView(this);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    lp.addRule(RelativeLayout.ALIGN_TOP);
    tv.setLayoutParams(lp);
    tv.setText("FPS: 0");
    tv.setBackgroundColor(0x4060ff70);
    rl.addView(tv);

    setContentView(rl);
Run Code Online (Sandbox Code Playgroud)

android glsurfaceview

8
推荐指数
1
解决办法
6556
查看次数