首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >GLSurfaceView -如何制作半透明背景

GLSurfaceView -如何制作半透明背景
EN

Stack Overflow用户
提问于 2013-07-26 18:10:06
回答 5查看 8.5K关注 0票数 12

我尝试使用GLSurfaceView进行渲染,并通过docs设置格式:

代码语言:javascript
复制
getHolder().setFormat(PixelFormat.TRANSLUCENT);

我使用的是在onDrawFrame中绘制的GLSurfaceView.Renderer:

代码语言:javascript
复制
GLES20.glClearColor(0, 0, 1, .5f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

但是,GLSurfaceView中的GL渲染不是半透明的,而是完全蓝色的。如果我省略了glClear调用,那么它就完全是黑色的。

如何使GL渲染具有透明的背景,使其与绘制在其后面的视图混合?

编辑:这是我的GLSurfaceView:

代码语言:javascript
复制
class GLView extends GLSurfaceView{
   MyRenderer r;
   public GLView(Context ctx){
      super(ctx);
      setEGLContextClientVersion(2);

      getHolder().setFormat(PixelFormat.TRANSLUCENT);

      setEGLConfigChooser(8, 8, 8, 8, 16, 0);
      r = new MyRenderer(getContext());
      setRenderer(r);
   }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-31 22:29:25

好的,经过一些研究,我可以自己回答这个问题。

我最终用SurfaceView.setZOrderOnTop(true)把它画成了透明的。但是后来我失去了在我的GLSurfaceView上放置其他视图的可能性。

最后,我得出了两种可能的结果:

左边是所有其他视图下面的标准GL表面,它不能被绘制为透明的,因为GL表面是在应用程序的窗口表面之前绘制的,而GLSurfaceView只是在其位置上punches hole,以便通过GL表面被看到。

右边是用setZOrderOnTop(true)绘制的透明GL表面,因此它的表面被绘制在应用程序窗口的顶部。现在它是透明的,但绘制在视图层次结构中放置在其上的其他视图之上。

因此,似乎应用程序有一个窗口,它的视图层次结构是表面的,而SurfaceView有自己的表面,用于GL,它可能在应用程序窗口的顶部或下面。不幸的是,透明的GL视图无法在视图层次结构中与其他视图一起正确排序。

票数 9
EN

Stack Overflow用户

发布于 2013-07-31 01:02:05

您需要RGBA8888像素格式才能实现半透明:

代码语言:javascript
复制
private void init( boolean translucent, int depth, int stencil )
{
    /* By default, GLSurfaceView() creates a RGB_565 opaque surface.
     * If we want a translucent one, we should change the surface's
     * format here, using PixelFormat.TRANSLUCENT for GL Surfaces
     * is interpreted as any 32-bit surface with alpha by SurfaceFlinger.
     */
    this.getHolder().setFormat( PixelFormat.RGB_565 );
    if ( translucent )
    {
        this.getHolder().setFormat( PixelFormat.TRANSLUCENT );
    }

    setEGLContextFactory( new ContextFactory() );

    /* We need to choose an EGLConfig that matches the format of
     * our surface exactly. This is going to be done in our
     * custom config chooser. See ConfigChooser class definition
     * below.
     */
    setEGLConfigChooser( translucent ?
                         new ConfigChooser( 8, 8, 8, 8, depth, stencil ) :
                         new ConfigChooser( 5, 6, 5, 0, depth, stencil ) );

    setRenderer( new Renderer() );
}
票数 5
EN

Stack Overflow用户

发布于 2013-08-01 05:36:22

你有没有想过在setAlpha中使用LayerDrawable?这是我有两张图片的例子……一个是透明的(通过setAlpha),另一个不是。'calendar_cell‘是实心的,在背面,然后是一个透明的方框,显示它后面的日历单元格。这样你就可以堆叠你想要的任意多的图像,给它们一个不同的透明度。

代码语言:javascript
复制
Drawable []layers = new Drawable [2];
int imageResource1 = mContext.getResources().getIdentifier("drawable/calendar_cell", null, mContext.getPackageName());
Drawable background = v.getResources().getDrawable(imageResource1);
                        layers [0]= background;

int imageResource = mContext.getResources().getIdentifier("drawable/box_" + box, null, mContext.getPackageName());
Drawable boxImg = v.getResources().getDrawable(imageResource);
    boxImg.setAlpha(100);
    layers [1]= boxImg;

LayerDrawable layerDrawable = new LayerDrawable (layers);
v.setBackground(layerDrawable)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17878645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档