是否可以在 Xamarin Forms ContentView 中嵌入 Android.VideoView

Posted

技术标签:

【中文标题】是否可以在 Xamarin Forms ContentView 中嵌入 Android.VideoView【英文标题】:Is it possible to embed Android.VideoView in Xamarin Forms ContentView 【发布时间】:2019-01-31 23:07:18 【问题描述】:

我需要创建一个必须在 android 7.0 - 9.0 和最新 ios 上运行的移动应用

因此,在 Windows 10 上的 VS 2017 15.9.6 中,我尝试在共享项目中使用 Xamarin.Forms 3.4 作为原生 Android.VideoView 的容器。

我试图弄清楚如何做到这一点,因为 Mono.Android 示例不使用 Xamarin.Forms。那么,我是否需要在 xaml 文件中使用一种#ifdef 来嵌入 Android VideoView?还是我对这种方法完全错误?

【问题讨论】:

【参考方案1】:

使用共享项目,您可以在 XAML 中定义本机视图,然后在后面的代码中访问它们(这基本上是一项要求,因为本机 Android|iOS 控件不能直接绑定,并且大多数具有用于设置功能的方法调用无法通过 XAML 使用(即 VideoView 有一个 .SetVideoURI 方法,该方法没有基于 Xamarin 的包装器属性,因此您必须执行该方法才能播放视频)。

XAML:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:androidWidget="clr-namespace:Android.Widget;assembly=Mono.Android;targetPlatform=Android"
    xmlns:androidGraphics="clr-namespace:Android.Graphics;assembly=Mono.Android;targetPlatform=Android"
    xmlns:androidContext="clr-namespace:Forms40Shared.Droid;assembly=Forms40Shared.Android;targetPlatform=Android"
    x:Class="Forms40Shared.NativeEmbedPage" >
    <ContentPage.Content>
        <StackLayout Margin="20">
            <androidWidget:TextView x:Arguments="x:Static androidContext:MainActivity.Instance" Text="Welcome to Forms!" TextSize="24" View.HorizontalOptions="Center" >
                <androidWidget:TextView.Typeface>
                    <androidGraphics:Typeface x:FactoryMethod="Create">
                        <x:Arguments>
                            <x:String>cursive</x:String>
                            <androidGraphics:TypefaceStyle>Normal</androidGraphics:TypefaceStyle>
                        </x:Arguments>
                    </androidGraphics:Typeface>
                </androidWidget:TextView.Typeface>
            </androidWidget:TextView>
            <ContentView x:Name="contentView" HorizontalOptions="FillAndExpand" VerticalOptions="Center" HeightRequest="200" >
                <androidWidget:VideoView x:Arguments="x:Static androidContext:MainActivity.Instance"  />
            </ContentView>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

注意不要在全局程序集级别或在包含本机视图的 XAML 页面上启用XamlCompilation,因为它不起作用(并且在运行期间不会出现错误)编译或运行时,视图只是不显示,因为它们已被剥离)...

主要活动

[Activity(Label ~~~~
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity

    internal static MainActivity Instance  get; private set; 

    protected override void OnCreate(Bundle savedInstanceState)
    
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        Instance = this;

        ~~~
    

代码隐藏:

#if __ANDROID__
            var videoView = (contentView as NativeViewWrapper).NativeView as VideoView;
            videoView.SetVideoURI(Android.Net.Uri.Parse($"android.resource://Android.App.Application.Context.PackageName/raw/fireplace"));
            videoView.Start();
#elif __IOS__
            ~~~
#endif

输出:

https://msdn.microsoft.com/en-us/magazine/mt790186.aspx

【讨论】:

听起来真的很棒!尽管我似乎遗漏了一些东西:在您的 sn-p 代码中,您将 content 对象转换为 Xamarin.Forms.Platform.Android.NativeViewWrapper。由于xaml文件中没有这样的“content”对象,而是一个名为Item的“contentView”,我将sn-p调整为var videoView = (contentView as NativeViewWrapper).NativeView as VideoView;唉,作为 NativeViewWrapper 的 contentView 评估为 null 你能帮忙,我的代码有什么问题吗?谢谢。 此外,我在 App.xaml 中禁用了 XamlCompilation,并将命名空间从 Forms40Shared 调整为我项目的命名空间。唯一缺少的是:我在哪里可以获得 MainActivity 的静态实例?请帮忙.. 就是这样 - 谢谢。您是否偶然知道,如何设置 ContentView 的 Horizo​​ntalOptionsVerticalOptions,以便视频使用最大尺寸而不丢失其宽高比? @xy 您需要事先知道纵横比并将内容视图设置为该大小(通过将其嵌入到网格/绝对/等布局中,或者在运行时从实际计算视频。我个人会使用 AbsoluteLayout 并通过比例约束设置 ContentView(当然这意味着我知道视频的纵横比,4:3、19:6 等..0

以上是关于是否可以在 Xamarin Forms ContentView 中嵌入 Android.VideoView的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 Xaml 设计器或智能感知与 Xamarin.Forms 一起使用?

是否可以在 Xamarin Forms ContentView 中嵌入 Android.VideoView

是否可以在 Xamarin Forms 中禁用应用程序的通知设置

是否可以在 Uno 项目中使用 Xamarin Forms 控件?

在 Xamarin.Forms 中创建 UI 元素

在 Xamarin 表单中使用效果的 Android 工具栏中心