Xamarin Forms Android видео (VideoView) черный флаг sh при загрузке страницы или клавише возврата + зацикливание - PullRequest
1 голос
/ 26 февраля 2020

Я следовал этому руководству / скопировал пример отсюда для реализации видеоплеера для iOS и Android в формах Xamarin: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/video-player/

Видеоплеер работает, но при загрузке страницы он в скором времени будет иметь черный цвет sh. Кроме того, при возврате в скором времени он будет показывать sh видеоплеер перед предыдущей страницей.

Вы можете попробовать: videoView.setZOrderOnTop(true);, но это дало мне проблемы с другими страницами, где видео все равно будет присутствовать, даже если это не было в xaml.

1 Ответ

1 голос
/ 26 февраля 2020

Чтобы исправить это и интегрировать циклы в Xamarin Forms (при условии, что вы следовали приведенному выше руководству):

Добавьте приведенный ниже код в конец функции OnElementChanged ()

videoView.SetOnPreparedListener(new VideoLoop(videoView));

Создайте класс videol oop (я также хотел l oop)



using Android.Graphics;
using Android.Media;
using Android.Views;
using Android.Widget;
using YOURPROJECTHERE.Droid.FormsVideoLibrary;
using Java.Lang;
using System.Threading.Tasks;

namespace FormsVideoLibrary.Droid
{
    public class VideoLoop : Java.Lang.Object, Android.Media.MediaPlayer.IOnPreparedListener
    {
        VideoView Video;
        public VideoLoop(VideoView video)
        {
            Video = video;
            Video.SetBackgroundColor(Android.Graphics.Color.White);
        }

        public void OnPrepared(MediaPlayer mp)
        {
            mp.SetOnInfoListener(new OnInfo(Video));

            //Remove or comment the line below if you don't want to loop
            mp.Looping = true;
            mp.Start();
        }
    }
}

Теперь мы делаем цвет фона прозрачным при нажатии на первый кадр (не в OnPrepared потому что он все еще буферизируется в этот момент):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.Media;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace YOURPOJECTNAMESPACE.Droid.FormsVideoLibrary
{
    class OnInfo : Java.Lang.Object, Android.Media.MediaPlayer.IOnInfoListener
    {
        VideoView Video;
        public OnInfo(VideoView video)
        {
            Video = video;
        }

        bool MediaPlayer.IOnInfoListener.OnInfo(MediaPlayer mp, MediaInfo what, int extra)
        {

            if (what == MediaInfo.VideoRenderingStart)
            {
                // video started; hide the placeholder.
                Video.SetBackgroundColor(Android.Graphics.Color.Transparent);
                return true;
            }
            return false;
        }
    }
}

Я также добавил ниже в функцию OnStopRequested в классе VideoRenderer.

        void OnStopRequested(object sender, EventArgs args)
        {
            videoView.StopPlayback();
            videoView.SetBackgroundColor(Android.Graphics.Color.White);
        }

И затем, наконец, вернулся в общие Проект xaml.cs добавить ниже на каждой странице с видео:

 protected override void OnAppearing()
        {
            xNAMEOFYOURVIDEO.Play();           
            xNAMEOFYOURVIDEO.Source = new ResourceVideoSource
                {
                    Path = "yourfile.mp4"
                };
        }

  protected override void OnDisappearing()
        {
            xNAMEOFYOURVIDEO.Stop();
        }
...