Android VideoView BringToFront在Xamarin

时间:2017-03-18 23:55:01

标签: android xamarin

我正在尝试将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.

解决问题的拉取请求非常棒,非常感谢!

1 个答案:

答案 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)。

您可以看到视频视图将显示为您的要求:

enter image description here