基本前提是我有 2 个 Android View ...一个填满屏幕的背景 View (在本例中为 ImageView
),以及一个 LibGDX GLSurfaceView
在前台,是 LibGDX
应用程序。我想在 LibGDX GLSurfaceView
上打一个洞,这样我就可以看到背景 ImageView
了。即,LibGDX
部分的行为就像一个覆盖层。可悲的是我根本无法让它工作。我剥离了所有代码,只留下了最基本的必需品,希望能展示我正在尝试做的事情。
在完整的应用程序中,它是一个 Android 应用程序,其中背景 View
是一个视频,而前景,由 LibGdx
渲染,是一组视频控件,需要叠加在视频上。
public class MiniClientGDXTestActivity extends AndroidApplication implements ApplicationListener {
@Bind(R.id.surface)
FrameLayout uiFrameHolder;
Stage stage;
Batch batch;
Camera camera;
Viewport viewport;
ShapeRenderer shapeRenderer;
private View miniClientView;
public MiniClientGDXTestActivity() {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
hideSystemUI(this);
setContentView(R.layout.miniclientgltest_layout);
ButterKnife.bind(this);
AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
//cfg.useGL20 = false;
// we need to change the default pixel format - since it does not include an alpha channel
// we need the alpha channel so the camera preview will be seen behind the GL scene
cfg.r = 8;
cfg.g = 8;
cfg.b = 8;
cfg.a = 8;
miniClientView = initializeForView(this, cfg);
if (graphics.getView() instanceof SurfaceView) {
SurfaceView glView = (SurfaceView) graphics.getView();
glView.setBackgroundColor(android.graphics.Color.TRANSPARENT);
// force alpha channel - I'm not sure we need this as the GL surface is already using alpha channel
glView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
}
uiFrameHolder.addView(miniClientView);
}
@Override
public void create() {
camera = new OrthographicCamera();
viewport = new StretchViewport(1920, 1080, camera);
stage = new Stage(viewport);
batch = stage.getBatch();
shapeRenderer = new ShapeRenderer();
Gdx.graphics.setContinuousRendering(false);
Gdx.graphics.requestRendering();
}
@Override
public void resize(int width, int height) {
stage.getViewport().setWorldSize(1920, 1080);
stage.getViewport().update(width, height, true);
Gdx.graphics.requestRendering();
}
@Override
public void render() {
Gdx.gl20.glClearColor(0, 0, 0, 0);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
// draw whatever we have on the stage
stage.draw();
// draw red rectangle
drawRect(10, 10, 1000, 1000);
// draw a blue box
fillRect(50, 50, 800, 800);
// punch a hole in the surface (ie, clear an area) so that we can see the view that is
// behind this view
clearRect(200, 200, 1600, 600);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
public void drawRect(final int x, final int y, final int width, final int height) {
shapeRenderer.setProjectionMatrix(camera.combined);
shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
shapeRenderer.rect(x, y, width, height, Color.RED, Color.RED, Color.RED, Color.RED);
shapeRenderer.end();
}
public void fillRect(final int x, final int y, final int width, final int height) {
shapeRenderer.setProjectionMatrix(camera.combined);
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
shapeRenderer.rect(x, y, width, height, Color.BLUE, Color.BLUE, Color.BLUE, Color.BLUE);
shapeRenderer.end();
}
public void clearRect(final int x, final int y, final int width, final int height) {
// Gdx.gl.glEnable(GL20.GL_BLEND);
// Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
shapeRenderer.setProjectionMatrix(camera.combined);
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
shapeRenderer.setColor(Color.CLEAR);
shapeRenderer.rect(x, y, width, height);
shapeRenderer.end();
// Gdx.gl.glDisable(GL20.GL_BLEND);
}
}
这是 XML 布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:keepScreenOn="true">
<FrameLayout
android:visibility="visible"
android:id="@+id/surface"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- to see if we can see this -->
<ImageView
android:layout_width="fill_parent"
android:layout_height="match_parent" android:scaleType="fitXY" android:src="@drawable/background"/>
<!-- gdx gets added here -->
</FrameLayout>
</FrameLayout>
最佳答案
似乎使用 PixelFormat.RGBA_8888
调用 setZOrderOnTop
就可以了。
if (graphics.getView() instanceof SurfaceView) {
GLSurfaceView glView = (GLSurfaceView) graphics.getView();
glView.setZOrderOnTop(true);
glView.getHolder().setFormat(PixelFormat.RGBA_8888);
}
现在,当调用 clearRect
方法时,它会在 GLSurfaceView 中打一个洞,以查看下方的 Android View 。
关于android - 如何使 LibGDX GLSurfaceView 透明,以便我们可以看到它后面的 Android ImageView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027976/