Компоновка Android MapView и SurfaceView - PullRequest
0 голосов
/ 13 октября 2010

У меня есть приложение с 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 пробивает отверстие в своем окне, чтобы его поверхность отображалась. Иерархия представления позаботится о правильной компоновке с Surface любых братьев и сестер SurfaceView, которые обычно появляются поверх него.

Для меня это означает, что я должен быть в состоянии поместить SurfaceView первым в файл, и он должен «пробить» MapView и показать, что у него есть. Но на самом деле они кажутся двумя видами, и одновременно виден только один.

После размышления: я попытался установить фон # 00000000, чтобы альфа фона была нулевой (то есть прозрачной), но это не оказало никакого влияния.

Ответы [ 2 ]

0 голосов
/ 30 октября 2010

Я закончил тем, что отказался от SurfaceView, несмотря на его замечательные возможности для плавного рисования.Сейчас я просто использую обычный старый View, переопределяя его метод onDraw.MapView внизу в настоящее время обновляется каждый раз, когда рисуется этот новый вид, но я собираюсь использовать функцию кэширования чертежей в представлениях, чтобы упростить это.

0 голосов
/ 21 октября 2010

Настройка альфа сама по себе в этом случае не поможет.

Когда вы настраиваете свои представления, установите PixelFormat для SurfaceHolder вида:

    glsView = (GLSurfaceView) findViewById(R.id.surfaceview);
    glsView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
...