android - Xamarin 视频播放器组件在 Android 上拉伸(stretch)视频

标签 android xamarin xamarin.forms video-player custom-renderer

我有一个 Xamarin 表单项目,我需要在网格内显示视频,所以我购买了这个视频播放器组件:Octane VideoPlayer

它在 IOS 上运行良好,但在 Android 上它不符合纵横比,很多视频都被拉伸(stretch)了。

我为这个视频播放器尝试了自定义渲染,但没有任何变化,当我设置断点时,我发现渲染代码从未到达。

我错过了什么吗?

示例

CS:

   public partial class VideoPlayer : ContentPage
{
    public VideoPlayerPage()
    {

        InitializeComponent();
        VideoPlayer.Source = "16/9_video.mp4";
    }
}

自定义渲染:

[assembly: ExportRenderer(typeof(Octane.Xam.VideoPlayer.VideoPlayer), typeof(Assayil.Droid.VideoPlayerExtRenderer))]

**

public  class VideoPlayerExtRenderer : VideoPlayerRenderer
{

    protected override void OnElementChanged(ElementChangedEventArgs<VideoPlayer> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            Control.Started += (s2, e2) =>
            {
                UpdateVideoSize();
                Control.Player.VideoSizeChanged += (s3, e3) => UpdateVideoSize();
            };
        }
    }

    protected override void OnLayout(bool changed, int l, int t, int r, int b)
    {
        base.OnLayout(changed, l, t, r, b);

        UpdateVideoSize();
    }

    private void UpdateVideoSize()
    {
        if (Element.FillMode == FillMode.Resize)
        {
            Control.Layout(0, 0, Width, Height);
            return;
        }

        // assume video size = view size if the player has not been loaded yet
        var videoWidth = Control.Player?.VideoWidth ?? Width;
        var videoHeight = Control.Player?.VideoHeight ?? Height;

        var scaleWidth = (double)Width / (double)videoWidth;
        var scaleHeight = (double)Height / (double)videoHeight;

        double scale;
        switch (Element.FillMode)
        {
            case FillMode.ResizeAspect:
                scale = Math.Min(scaleWidth, scaleHeight);
                break;
            case FillMode.ResizeAspectFill:
                scale = Math.Max(scaleWidth, scaleHeight);
                break;
            default:
                // should not happen
                scale = 1;
                break;
        }

        var scaledWidth = (int)Math.Round(videoWidth * scale);
        var scaledHeight = (int)Math.Round(videoHeight * scale);

        // center the video
        var l = (Width - scaledWidth) / 2;
        var t = (Height - scaledHeight) / 2;
        var r = l + scaledWidth;
        var b = t + scaledHeight;
        Control.Layout(l, t, r, b);
    }
}

最佳答案

将 VideoPlayer 放在 Frame 中,然后将其放在 StackLayout 中,为 VerticalOptions 设置为 CenterAndExpand 应该可以解决问题。完美适用于 Android,但您可能希望使其依赖于平台,它将在 iOS 中以容器大小播放(视频看起来不错,但 Controller 在没有此修复的情况下看起来更好)。

关于android - Xamarin 视频播放器组件在 Android 上拉伸(stretch)视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42088533/

相关文章:

android - 如何使用 Dev 工具在任何正在重绘的屏幕部分上闪烁瞬时粉红色矩形?

android - Jquery Mobile 和 Swipe JS 不兼容导致选择列表无法在 Android 上运行

xamarin.forms - 如何在 ActivityIndi​​cator 运行时禁用后退按钮

xamarin - OnAppearing() 方法在调用 OnCurrentPageChanged() 方法之前执行

xamarin - 如何在xamarin中隐藏导航工具栏图标?

java - 使用 EditText 更新 SeekBar

java - 我的布局在低 dpi 设备上无法正确缩放

ios - 在 Xamarin iOS 的 UIActivityIndi​​catorView 中隐藏指示器

android - 什么是 com.android.externalstorage?

c# - Xamarin 'Resource.Layout' 不包含 'Tabbar' 错误的定义