C# Xamarin Android VideoView播放器控件不跟踪播放器位置

C# Xamarin Android VideoView播放器控件不跟踪播放器位置,c#,xamarin,xamarin.android,C#,Xamarin,Xamarin.android,我在Xamarin Forms应用程序中有一个ListView,其中videoplayer作为ListViewItem。使用本机渲染器实现的视频播放器。它工作正常,但如果在显示播放器控件时移动videoplayer滚动列表视图,则控件不会跟随播放器位置 这是渲染器的某些部分。我不确定问题出在哪里,所以我不知道应该粘贴什么代码 public class VideoPlayerRenderer : ViewRenderer<VideoPlayer, ARelativeLayout> 以

我在Xamarin Forms应用程序中有一个ListView,其中videoplayer作为ListViewItem。使用本机渲染器实现的视频播放器。它工作正常,但如果在显示播放器控件时移动videoplayer滚动列表视图,则控件不会跟随播放器位置

这是渲染器的某些部分。我不确定问题出在哪里,所以我不知道应该粘贴什么代码

public class VideoPlayerRenderer : ViewRenderer<VideoPlayer, ARelativeLayout>
以下是一个解决方法:

在Droid项目中创建自定义MediaController:

class MyController : MediaController
{
    private Context _context;
    public MyController(Context context) : base(context)
    {
        _context = context;
    }
    private bool _isShowing { get; set; } = false;
    public override bool IsShowing { get { return _isShowing; } }

    public override void Show()
    {
        base.Show();
        _isShowing = true;

        ViewGroup parent = ((ViewGroup)this.Parent);
        parent.Visibility = ViewStates.Visible;
    }

    public override void Hide()
    {
        base.Hide();
        _isShowing = false;

       ViewGroup parent = ((ViewGroup)this.Parent);
        parent.Visibility = ViewStates.Gone;
    }
}
然后在VideoPlayerRenderer中,在OnVideoViewPrepared方法中设置MediaController:


如果你有一个内置3个视频播放器的scrollview,它的行为是否相同?还是只在ListView上?我不知道,但答案很好,很高兴你解决了问题
mediaController = new MediaController(Context);
mediaController.SetMediaPlayer(videoView);
videoView.SetMediaController(mediaController);
class MyController : MediaController
{
    private Context _context;
    public MyController(Context context) : base(context)
    {
        _context = context;
    }
    private bool _isShowing { get; set; } = false;
    public override bool IsShowing { get { return _isShowing; } }

    public override void Show()
    {
        base.Show();
        _isShowing = true;

        ViewGroup parent = ((ViewGroup)this.Parent);
        parent.Visibility = ViewStates.Visible;
    }

    public override void Hide()
    {
        base.Hide();
        _isShowing = false;

       ViewGroup parent = ((ViewGroup)this.Parent);
        parent.Visibility = ViewStates.Gone;
    }
}
private void OnVideoViewPrepared(object sender, EventArgs e)
    {
        MyController mc = new MyController(videoView.Context);
        videoView.SetMediaController(mc);
        FrameLayout f = (FrameLayout)mc.Parent;
        Android.Widget.RelativeLayout.LayoutParams lp = new Android.Widget.RelativeLayout.LayoutParams(
                Android.Widget.RelativeLayout.LayoutParams.MatchParent, Android.Widget.RelativeLayout.LayoutParams.WrapContent);
        lp.AddRule(LayoutRules.AlignParentBottom);
        ((LinearLayout)f.Parent).RemoveView(f);
        ((Android.Widget.RelativeLayout)videoView.Parent).AddView(f, lp);
        mc.SetAnchorView(videoView);
    }