Накладывание SurfaceView поверх ImageViews поверх VideoView
Я работаю над небольшим приложением для Android-планшета, которое требует некоторых необычных визуальных эффектов:
- есть часть экрана показывают двойные закрытые двери
- после того, как пользователь делает какие-то вещи на остальной части экрана, двери оживляются и открываются в стороны
- когда двери открываются, они показывают за собой какое-то зацикленное фоновое видео (показывающее некоторую "классную" высокотехнологичную компьютерную анимацию)
- в верхней части видео есть определенные кнопки, которые можно нажимать и делать некоторые вещи
Я подумал, что я построю его, имея 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, которая не может быть решена, или я что-то упустил?
заранее спасибо!