0

我有一个带有 SurfaceView 和 MapView 的应用程序。它们显示在单个视图中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.google.android.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:apiKey="XXXXXXXXredactedXXXXXXXXXXXXx"
    />

<class.that.extends.SurfaceView
    android:id="@+id/surfaceview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#00000000"
    />

</RelativeLayout>

请注意,MapView 位于 SurfaceView 之前。正因为如此,MapView 被绘制在 SurfaceView 的“下方”,而我看到的只是黑色背景,而我在 SurfaceView 上绘制的东西则显示出来。如果我交换顺序,并将 SurfaceView 首先放在文件中,然后将 MapView 放在第二位,则会绘制 MapView,而 SurfaceView 则不显示。

根据SurfaceView Javadoc

表面是 Z 顺序的,因此它位于持有其 SurfaceView 的窗口后面;SurfaceView 在其窗口中打了一个孔以显示其表面。视图层次结构将负责正确地将 SurfaceView 的任何兄弟姐妹与 Surface 合成,这些兄弟通常会出现在它的顶部。

对我来说,这意味着我应该能够将 SurfaceView 放在文件中的第一位,并让它“穿透” MapView 并显示它的内容。但是,实际上,它们似乎是两种视图,一次只能看到一个。

经过思考:我尝试将背景设置为#00000000,以便背景的alpha为零(即透明),但它没有任何效果。

4

2 回答 2

0

在这种情况下,单独的 alpha 设置并没有真正的帮助。

设置视图时,设置视图的 SurfaceHolder 的 PixelFormat:

    glsView = (GLSurfaceView) findViewById(R.id.surfaceview);
    glsView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
于 2010-10-21T13:27:02.543 回答
0

我最终放弃了 SurfaceView,尽管它具有平滑绘图的出色功能。现在我只是使用一个普通的旧视图,覆盖它的 onDraw 方法。当前每次绘制这个新视图时都会刷新下面的 MapView,但我正在考虑使用视图的绘图缓存功能来简化它。

于 2010-10-29T23:56:11.087 回答