Можно ли встраивать Android.VideoView в Xamarin Forms ContentView - PullRequest
0 голосов
/ 01 февраля 2019

Мне нужно создать мобильное приложение, которое должно работать на Android 7.0 - 9.0 и последней версии iOS

Так что в моем VS 2017 15.9.6 на Windows 10 я пытаюсь использовать Xamarin.Forms 3.4 вобщий проект в качестве контейнера для собственного Android.VideoView.

Я пытаюсь выяснить, как это сделать, так как примеры Mono.Android не используют Xamarin.Forms.Итак, мне нужен своего рода #ifdef в файле xaml, чтобы встроить Android VideoView?Или я совершенно не прав с таким подходом?

1 Ответ

0 голосов
/ 01 февраля 2019

Используя общие проекты, вы можете определить собственные представления в 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>

Примечание : Не включайте XamlCompilation на глобальном уровне сборки или на страницах XAML, которые содержат собственные представления, так как это не будет работать (и при компиляции или при ошибках нетво время выполнения, представления просто не отображаются, поскольку они были удалены) ...

MainActivity

[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

enter image description here Выход:

...