xamarin.android:视频在启动时冻结片刻

时间:2018-03-23 10:04:15

标签: android xamarin xamarin.android

我尝试在Android 4.4上显示我的应用中的一系列视频和一系列图像(在一个屏幕上显示两个图像,然后是下一个视频,然后是下一个图像,依此类推)。我首先加载视频,然后在视频结束时运行OnComplete()方法:

public class OnComplete : Object, MediaPlayer.IOnCompletionListener
{
    public void OnCompletion(MediaPlayer mp)
    {
        Runnable switchMedia = new Runnable(() =>
        {
            MainActivity._handler.Post(new Runnable(() =>
            {
                int imageListLength = MainActivity.imgList.Count;
                if(imageListLength > 0)
                {
                    MainActivity.imageIndex = (MainActivity.imageIndex + 1) % imageListLength;
                    MainActivity.fullScreenVideo.Visibility = ViewStates.Gone;
                    MainActivity.dividedLayout.Visibility = ViewStates.Visible;                        
                    MainActivity.imgSwitcher1.SetImageURI(Android.Net.Uri.FromFile(new Java.IO.File(MainActivity.imgList[MainActivity.imageIndex])));
                    MainActivity.imageIndex = (MainActivity.imageIndex + 1) % imageListLength;
                    MainActivity.imgSwitcher2.SetImageURI(Android.Net.Uri.FromFile(new Java.IO.File(MainActivity.imgList[MainActivity.imageIndex])));
                }
                MainActivity._handler.PostDelayed(new Runnable(() =>
                {
                    int videoListLength = MainActivity.vidList.Count;
                    if(videoListLength > 0)
                    {
                        MainActivity.videoIndex = (MainActivity.videoIndex + 1) % videoListLength;
                        MainActivity.fullScreenVideo.Visibility = ViewStates.Visible;
                        MainActivity.dividedLayout.Visibility = ViewStates.Gone;
                        MainActivity.fullScreenVideo.SetVideoURI(Android.Net.Uri.FromFile(new Java.IO.File(MainActivity.vidList[MainActivity.videoIndex])));                           
                        MainActivity.fullScreenVideo.Start();
                    }
                }), 10000);
            }));
        });
        switchMedia.Run();
    }
}

这是一个主要课程:

[Activity(Label = "RandomDisplay", MainLauncher = true)]
public class MainActivity : Activity, ViewSwitcher.IViewFactory
{
    public static List<string> imgList;
    public static int imageIndex = 0;
    public static List<string> vidList;
    public static int videoIndex = 0;
    public static LinearLayout dividedLayout;
    public static ImageSwitcher imgSwitcher1;
    public static ImageSwitcher imgSwitcher2;
    public static VideoView fullScreenVideo;
    public static Handler _handler;

    public View MakeView()
    {
        ImageView imageView = new ImageView(this);
        imageView.SetScaleType(ImageView.ScaleType.FitXy);
        imageView.LayoutParameters = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent);
        return imageView;
    }

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        imgList = new List<string>();
        vidList = new List<string>();
        PopulateList(ref imgList, @"/sdcard/Download/IV/Img/");
        PopulateList(ref vidList, @"/sdcard/Download/IV/Video");
        Window.AddFlags(WindowManagerFlags.Fullscreen);
        ActionBar.Hide();
        _handler = new Handler();
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);
        imgSwitcher1 = FindViewById<ImageSwitcher>(Resource.Id.ImageSwitcher1);
        imgSwitcher1.SetFactory(this);
        imgSwitcher2 = FindViewById<ImageSwitcher>(Resource.Id.ImageSwitcher2);
        imgSwitcher2.SetFactory(this);
        fullScreenVideo = FindViewById<VideoView>(Resource.Id.FullScreenVideo);
        dividedLayout = FindViewById<LinearLayout>(Resource.Id.DividedScreenLayout);
        dividedLayout.Visibility = ViewStates.Gone;
        fullScreenVideo.SetVideoURI(Android.Net.Uri.FromFile(new Java.IO.File(vidList[0])));
        fullScreenVideo.SetOnCompletionListener(new OnComplete());
        fullScreenVideo.Start();
    }

    private void PopulateList(ref List<string> list, string directory)
    {
        Handler h = new Handler();
        if (!Directory.Exists(directory))
        {
            h.PostAtFrontOfQueue(new Runnable(() =>
            {
                Toast.MakeText(this, directory + " doesn't exist.", ToastLength.Long).Show();
            }));
            return;
        }
        h.Post(new Runnable(() =>
        {
            Toast.MakeText(this, directory + " exists.", ToastLength.Long).Show();
        }));
        foreach (string s in Directory.GetFiles(directory))
        {
            list.Add(s);
        }
    }
}

视频和图片是从sdcard / Download目录加载的。视频播放始终如下所示:视频播放 - &gt;暂停一下 - &gt;继续正常发挥到最后。它可能有什么问题?

1 个答案:

答案 0 :(得分:0)

  

视频和图片是从sdcard / Download目录加载的。视频播放始终如下所示:视频播放 - &gt;暂停一下 - &gt;继续正常发挥到最后。它可能有什么问题?

设备需要时间将视频加载到内存中。它没有问题,你需要的是将负载放入其中。您可以使用ProgressDialogProgressBar来执行此操作。并在OnPrepared时停止进度。