提问人:hk77 提问时间:11/10/2023 更新时间:11/11/2023 访问量:118
Xamarin 形成类似视频滚动的 tiktok
Xamarin forms tiktok like video scrolling
问:
我试图创建一个像 tiktok 一样的视频滚动,使用 xamarin 表单。我已经设法创建了视频列表的数据模型,并且带有视频的视频列表显示但未全屏显示。
我的问题:在我的 xalm 代码中,我只想全屏显示一个视频,而不是用户全屏显示下一个或上一个视频(如 tiktok)
这是我的 xalm 代码:
<?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:videoplayer="clr-namespace:Octane.Xamarin.Forms.VideoPlayer;assembly=Octane.Xamarin.Forms.VideoPlayer"
x:Class="lf.MyPages.Lomy.Discover" x:Name="leafDiscoverPage">
<Grid>
<CollectionView x:Name="VideosCollectionView"
ItemsLayout="VerticalList"
RemainingItemsThreshold="1"
Scrolled="OnScrolled"
RemainingItemsThresholdReached="OnRemainingItemsThresholdReached">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid HeightRequest="{Binding Source={x:Reference leafDiscoverPage}, Path=Height}"
WidthRequest="{Binding Source={x:Reference leafDiscoverPage}, Path=Width}">
<!-- Replace 'octane:VideoPlayer' with your actual video player control namespace -->
<videoplayer:VideoPlayer Source="{Binding UserVideoBlobAdress}"
AutoPlay="{Binding IsPlaying}"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand" />
<!-- Add other UI elements as needed -->
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
</ContentPage>
我的.cs代码:
public partial class Discover : ContentPage
{
MyUser UserConnected;
ObservableRangeCollection<UserVideoModel> MyListVideo;
private int _videoCount = 0;
public LeafDiscover ()
{
InitializeComponent ();
MyListVideo = new ObservableRangeCollection<UserVideoModel>();
// Initialize your ListVideo with initial video links
UserConnected = (MyUser)App.GetProperties("UserConnected");
OnInitVideoList();
}
public void UpdateVideoUrl(List<UserVideoModel> tmpuservideo)
{
foreach (var tmpvide in tmpuservideo)
{
tmpvide.UserVideoBlobAdress = "https://fo.blob.net/app/"+tmpvide.UserVideoBlobAdress;
}
}
async void OnInitVideoList()
{
var MyInitVideo = await VideosManager.GetVideoAsync(UserConnected.MyId.ToString(), false, "");
UpdateVideoUrl(MyInitVideo);
foreach (var tmpvide in MyInitVideo)
{
Console.WriteLine("mook "+ tmpvide.UserVideoBlobAdress);
}
MyListVideo.AddRange(MyInitVideo);
VideosCollectionView.ItemsSource = MyListVideo;
}
private void OnRemainingItemsThresholdReached(object sender, EventArgs e)
{
if (_videoCount >= 20)
{
// Load more videos or handle the end of the list
_videoCount = 0;
}
}
private void OnScrolled(object sender, ItemsViewScrolledEventArgs e)
{
// Determine the visible item and update playback
var centerIndex = e.CenterItemIndex;
UpdateVideoPlayback(centerIndex);
}
private void UpdateVideoPlayback(int centerIndex)
{
for (int i = 0; i < MyListVideo.Count; i++)
{
MyListVideo[i].IsPlaying = i == centerIndex;
}
}
protected override void OnAppearing()
{
base.OnAppearing();
// Optionally start playing the first video or the video in the center
if (MyListVideo.Count > 0)
{
MyListVideo[0].PlayVideo(); // or another index if needed
}
}
protected override void OnDisappearing()
{
base.OnDisappearing();
// Stop all videos
foreach (var video in MyListVideo)
{
video.StopVideo();
}
}
}
答:
0赞
Liqun Shen-MSFT
11/10/2023
#1
老实说,CarouselView 比 CollectionView 更适合您的问题。因为
CarouselView 是一个视图,用于在可滚动布局中显示数据,用户可以在其中滑动以在项目集合中移动。
您可以通过将“方向”设置为“垂直”来垂直显示其项目。
若要全屏显示,可以轻松地将 VerticalOption 和 HorizontalOption 设置为 Fill 或 FillAndExpand。
如果您有任何问题,请告诉我。
评论
0赞
hk77
11/10/2023
CarrouselView 没有 OnRemainingItemsThresholdReached,你有例子吗?
0赞
Liqun Shen-MSFT
11/10/2023
是否要在运行时更改 ItemsSource?
0赞
hk77
11/10/2023
如果使用旋转木马视图,我会确保只播放第一个视频,然后在滚动时开始播放下一个或上一个视频。请问你有一个与我的问题有关的例子吗?感谢您的帮助
0赞
Liqun Shen-MSFT
11/11/2023
我使用 CarouselView 添加了一个新答案。你可以试一试。
0赞
hk77
11/11/2023
谢谢,我正在尝试实现它。您是如何将MainPageViewModel链接到carrouselView的?
评论