我正在尝试将VideoView从后面带到前面,但没有任何效果。在下面,我将首先介绍代码,然后我将介绍我尝试的内容,并希望有人能够解决我的问题:
这是使用Xamarin编写的Android应用程序的简化repro。
不用多说,这是我的代码:
using Android.App;
using Android.Widget;
using Android.OS;
using Android.Media;
using System;
namespace Experiment
{
public class Listener : Java.Lang.Object, MediaPlayer.IOnCompletionListener
{
private Action action;
public Listener(Action action)
{
this.action = action;
}
public void OnCompletion(MediaPlayer unused)
{
this.action();
}
}
[Activity(Label = "Experiment", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
private VideoView foreView;
private VideoView backView;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
this.foreView = this.FindViewById<VideoView>(Resource.Id.foreView);
this.backView = this.FindViewById<VideoView>(Resource.Id.backView);
this.foreView.SetVideoURI(Android.Net.Uri.Parse("..."));
this.foreView.Start();
this.foreView.SetOnCompletionListener(new Listener(this.OnForeViewCompleted1));
this.backView.SetVideoURI(Android.Net.Uri.Parse("..."));
this.backView.SetOnCompletionListener(new Listener(this.OnBackViewCompleted1));
}
private void OnForeViewCompleted1()
{
this.backView.Start();
this.foreView.SetVideoURI(Android.Net.Uri.Parse("..."));
this.backView.BringToFront();
}
private void OnBackViewCompleted1()
{
this.foreView.SetOnCompletionListener(null);
this.foreView.Start();
this.foreView.BringToFront();
}
}
}
出于隐私原因 - 实际视频网址已替换为&#39; ...&#39;,任何可以提供mp4文件的网址都可以使用。
这是与活动相关的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
android:id="@+id/backView"
android:layout_width="200px"
android:layout_height="200px"
android:layout_marginTop="0px"
android:layout_marginLeft="0px" />
<VideoView
android:id="@+id/foreView"
android:layout_width="200px"
android:layout_height="200px"
android:layout_marginTop="0px"
android:layout_marginLeft="50px" />
</RelativeLayout>
我打算让foreView完全遮挡backView,但是,我故意将foreView向右移动50px以显示效果。
可以在我的GitHub repository
中找到完整的,可运行的Xamarin解决方案当我们运行该程序时,它将首先在foreView上播放视频,完成后,它将在backView上播放视频,完成后,它会尝试再次启动foreView并播放foreView,但它会不显示遮挡backView,而是backView遮挡了frontView,这是我需要解决的问题。
上面描述的问题,这是我的尝试:
foreView.Invalidate() does not work.
foreView.RequestLayout() does not work.
foreView.Parent.RequestLayout() does not work.
解决问题的拉取请求非常棒,非常感谢!
答案 0 :(得分:0)
我已经尝试过某种方法将VideoView
放在前面,但它不像你说的那样有效。
但您可以发现VideoView
Z-Order级别取决于添加顺序。
因此,作为一种解决方法,我更改了两个VideoView
的添加顺序:
private void OnForeViewCompleted1()
{
//backView.BringToFront();
//backView.SetZOrderOnTop(true);
//myfatherLayout.UpdateViewLayout(backView, backView.LayoutParameters);
myfatherLayout.RemoveView(foreView);
myfatherLayout.AddView(foreView);
img1.BringToFront();
this.backView.Start();
}
private void OnBackViewCompleted1()
{
//foreView.BringToFront();
// foreView.SetZOrderOnTop(true);
//myfatherLayout.UpdateViewLayout(foreView, foreView.LayoutParameters);
myfatherLayout.RemoveView(backView);
myfatherLayout.AddView(backView);
img2.BringToFront();
this.foreView.Start();
}
myfatherLayout
是视频观看容器(您的RelativeLayout
)。
您可以看到视频视图将显示为您的要求: