Накладывание SurfaceView поверх ImageViews поверх VideoView

Я работаю над небольшим приложением для Android-планшета, которое требует некоторых необычных визуальных эффектов:

  1. есть часть экрана показывают двойные закрытые двери
  2. после того, как пользователь делает какие-то вещи на остальной части экрана, двери оживляются и открываются в стороны
  3. когда двери открываются, они показывают за собой какое-то зацикленное фоновое видео (показывающее некоторую "классную" высокотехнологичную компьютерную анимацию)
  4. в верхней части видео есть определенные кнопки, которые можно нажимать и делать некоторые вещи

Я подумал, что я построю его, имея VideoView внизу, воспроизводящее зацикленное видео, затем поверх него я помещу кнопки внутри ImageViews, и поверх всего этого я помещу собственный SurfaceView, который рисует двери и их анимации.

У меня были трудные времена, когда последний SurfaceView покрывал VideoView, но каким-то образом сделал это с помощью stackru, однако я не могу заставить его покрывать кнопки. кнопки всегда отображаются поверх всего или под всем (делая их невидимыми).

Есть ли какое-то странное взаимодействие, происходящее здесь, потому что я делаю слои на поверхности?

(Я смотрел на Android: возможно ли иметь два представления поверхности друг над другом? Но это касается только наложения двух поверхностей, без изображения между ними, что я и сделал в приведенном ниже коде:)

Вот XML:

<FrameLayout android:id="@+id/right_view"
        android:layout_width="900dp"
        android:layout_height="550dp"
        android:layout_marginLeft="370dp"
        android:layout_marginTop="100dp">

        <RelativeLayout
            android:layout_width="900dp"
            android:layout_height="550dp">

            <VideoView android:id="@+id/video_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

            <ImageView android:id="@+id/purple_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="280dp"
                android:layout_marginTop="110dp"
                android:src="@drawable/purple_b"/>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="410dp"
                android:layout_marginTop="110dp"
                android:src="@drawable/green_b"/>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="540dp"
                android:layout_marginTop="110dp"
                android:src="@drawable/gray_b"/>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="280dp"
                android:layout_marginTop="320dp"
                android:src="@drawable/pink_b"/>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="410dp"
                android:layout_marginTop="320dp"
                android:src="@drawable/orange_b"/>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="540dp"
                android:layout_marginTop="320dp"
                android:src="@drawable/red_b"/>

        </RelativeLayout>

    </FrameLayout>

и вот код, который я использую для своего пользовательского SurfaceView с дверями и заставляя его появляться поверх всего:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_screen);

    // play video in VideoView
    final VideoView videoview = (VideoView) findViewById(R.id.video_view);
    Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.video);
    videoview.setVideoURI(uri);
    videoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.setLooping(true);
        }
    });
    videoview.start();

    // add doors on top
    FrameLayout activityLayout = (FrameLayout) findViewById(R.id.right_view);
    doorsView = new DoorsView(this); // DoorsView extends SurfaceView and works fine when not layered
    doorsView.setLayoutParams(new FrameLayout.LayoutParams(
            FrameLayout.LayoutParams.MATCH_PARENT,
            FrameLayout.LayoutParams.MATCH_PARENT));
    activityLayout.addView(doorsView);

    // this block of code makes sure the custom surfaceview/canvas is drawn on top the other child-views inside the parent using some google-voodoo
    final ViewGroup parent = (ViewGroup)doorsView.getParent();
    if (null != parent) {
        parent.removeView(doorsView);
        parent.addView(doorsView, 0);
    }
}

какие-нибудь идеи о том, как получить нужный мне результат? это какая-то странность, связанная с взаимодействием SurfaceView и / или ImageViews, которая не может быть решена, или я что-то упустил?

заранее спасибо!

0 ответов

Другие вопросы по тегам