Xamarin.Forms 图片 GIF 动画在安卓设备上无法播放。

3

我是Xamarin的新手,尝试在Image控件中播放Gif动画。在我的iOS模拟器中它可以正常工作,但当我在Android模拟器中启动应用程序时,Gif动画无法播放。我没有使用Legacy Renderer,但我也没有指定使用快速渲染(我认为这不是必须的)。 以下是我的XAML文件:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Connect.Views.SplashPage">
<ContentPage.Content>
    <StackLayout Margin="20,35,20,20">
        <Image Source="splashAni.gif" VerticalOptions="CenterAndExpand"
               HorizontalOptions="Center" IsAnimationPlaying="True"/>
    </StackLayout>
</ContentPage.Content>

我不知道出了什么问题,希望你能帮助我,提前感谢!


你设置了isAnimationPlaying = true吗? - undefined
2
就像你在代码中看到的那样,是的,我设置了它。 - undefined
哦,抱歉。我没有看到那个。你有试过其他的gif吗? - undefined
你的Xamarin.Forms版本是多少?你的MainActivity中有这行代码(global::Xamarin.Forms.Forms.SetFlags("UseLegacyRenderers");)吗?如果有的话,请删除它。 - undefined
对我来说,加载gif文件大约需要3秒钟。我不知道为什么。我的文件大小只有154 KB。IsAnimationPlaying属性始终设置为true。 - undefined
3个回答

2
我已经花了一整天的时间在这上面。据我所知,大多数gif在Xamarin Forms中实际上并不起作用。它们只会显示为单帧静态图像,而且有时会先崩溃。即使它可以工作(似乎只在极其简单的应用程序中,如示例应用程序中),加载图像也需要5秒以上的时间。
该功能完全失效,应避免使用。

对于一个同名的功能,它似乎已经包含在Xamarin.Forms中了。 - undefined
从网络上看,人们总是建议尝试使用ffimageloading - undefined

1

我有点晚了,但这里是Gerald Versluis的一个工作示例,我可以用它来测试一些场景。这是一个基本示例,链接到GitHub上的源代码。

我怀疑你的资源可能没有包含在Android项目中,因此无法找到该文件。在Gerald的示例中,他的动画gif分别位于AnimatedGifForms.Android\Resources\drawableAnimatedGifForms.iOS\Resources中。

尽管你提到它在iOS上可行。看看他的简单示例,并将其与你正在做的内容进行比较,可能值得你花时间去做。

关于这一点:

我曾尝试使用他的示例的修改版本来加载一个动画gif,该gif是项目的NetStandard共享库中的EmbeddedResource,但一直无法成功。我正在使用ImageSource.FromStream( () => assembly.GetManifestResourceStream( resourcePath ) );方法从绑定转换器中的流创建ImageSource。我可以通过这种方式加载静态gif图像而没有问题。我甚至可以加载动画图像,作为静态图像而没有问题(xaml中必须缺少IsAnimationPlaying属性),但当我在xaml中添加/设置IsAnimationPlaying属性时,Android应用程序会崩溃,并显示以下内容:
=================================================================
    Native Crash Reporting
=================================================================
Got a SEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

No native Android stacktrace (see debuggerd output).

=================================================================
    Basic Fault Address Reporting
=================================================================
Memory around native instruction pointer (0x8c83a896):
0x8c83a886  10 8d 4d e4 8b 4d 10 89 4d e4 8d 4d e4 8b 4d e4  ..M..M..M..M..M.
0x8c83a896  89 4c 24 08 89 44 24 04 89 3c 24 8b c0 e8 c0 fe  .L$..D$..<$.....
0x8c83a8a6  ff ff 89 45 c4 8b 4d f0 8d 64 24 00 90 90 90 8b  ...E..M..d$.....
0x8c83a8b6  45 c4 e9 77 00 00 00 8b 4d f0 8d 64 24 00 90 90  E..w....M..d$...

=================================================================
    Managed Stacktrace:
=================================================================
      at Xamarin.Forms.Platform.Android.FormsAnimationDrawable:LoadImageAnimationAsync <0x0012e>
      at Xamarin.Forms.Platform.Android.FormsAnimationDrawable:LoadImageAnimationAsync <0x0013f>
      at Xamarin.Forms.Platform.Android.FormsAnimationDrawable:LoadImageAnimationAsync <0x0013f>
      at Xamarin.Forms.Platform.Android.FormsAnimationDrawable:LoadImageAnimationAsync <0x0013f>
      at Xamarin.Forms.Platform.Android.FormsAnimationDrawable:LoadImageAnimationAsync <0x0013f>
      at Xamarin.Forms.Platform.Android.FormsAnimationDrawable:LoadImageAnimationAsync <0x0
.....
      at Xamarin.Forms.Platform.Android.FormsAnimationDrawable:LoadImageAnimationAsync <0x0013f>
      at Xamarin.Forms.Platform.Android.FormsAnimationDrawable:LoadImageAnimationAsync <0x0013f>
      at Xamarin.Forms.Platform
.Android.FormsAnimationDrawable:LoadImageAnimationAsync <0x0013f>
      at Xamarin.Forms.Platform.Android.StreamImagesourceHandler:LoadImageAnimationAsync <0x0005b>
      at <UpdateBitmap>d__2:MoveNext <0x00768>
      at System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start <0x00127>
      at Xamarin.Forms.Platform.Android.ImageViewExtensions:UpdateBitmap <0x001bf>
      at Xamarin.Forms.Platform.Android.ImageViewExtensions:UpdateBitmap <0x00067>
      at <TryUpdateBitmap>d__6:MoveNext <0x0028f>
      at System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start <0x00147>
      at Xamarin.Forms.Platform.Android.FastRenderers.ImageElementManager:TryUpdateBitmap <0x0019b>
      at <OnElementChanged>d__3:MoveNext <0x004b7>
      at System.Runtime.CompilerServices.AsyncVoidMethodBuilder:Start <0x00127>
      at Xamarin.Forms.Platform.Android.FastRenderers.ImageElementManager:OnElementChanged <0x0015f>
      at System.EventHandler`1:invoke_void_object_TEventArgs <0x00143>
      at Xamarin.Forms.Platform.Android.FastRenderers.ImageRenderer:OnEl
ementChanged <0x0011b>
      at Xamarin.Forms.Platform.Android.FastRenderers.ImageRenderer:Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement <0x005d7>
      at Xamarin.Forms.Platform.Android.Platform:CreateRenderer <0x0013f>
      at Xamarin.Forms.Platform.Android.VisualElementPackager:AddChild <0x00487>
      at Xamarin.Forms.Platform.Android.VisualElementPackager:SetElement <0x00837>
      at Xamarin.Forms.Platform.Android.VisualElementPackager:Load <0x00057>
      at Xamarin.Forms.Platform.Android.VisualElementRenderer`1:SetPackager <0x00077>
      at Xamarin.Forms.Platform.Android.VisualElementRenderer`1:SetElement <0x007b7>
      at Xamarin.Forms.Platform.Android.VisualElementRenderer`1:Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement <0x00187>
      at Xamarin.Forms.Platform.Android.Platform:CreateRenderer <0x0013f>
      at Xamarin.Forms.Platform.Android.VisualElementPackager:AddChild <0x00487>
      at Xamarin.Forms.Platform.Android.VisualElementPackager:SetElement <0x00837>
      at Xamarin.Forms.Platform
.Android.VisualElementPackager:Load <0x00057>
      at Xamarin.Forms.Platform.Android.VisualElementRenderer`1:SetPackager <0x00077>
      at Xamarin.Forms.Platform.Android.VisualElementRenderer`1:SetElement <0x007b7>
      at Xamarin.Forms.Platform.Android.VisualElementRenderer`1:Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement <0x00187>
      at Xamarin.Forms.Platform.Android.Platform:CreateRenderer <0x0013f>
      at Xamarin.Forms.Platform.Android.AppCompat.Platform:AddChild <0x000b3>
      at Xamarin.Forms.Platform.Android.AppCompat.Platform:SetPageInternal <0x00297>
      at Xamarin.Forms.Platform.Android.AppCompat.Platform:SetPage <0x0067f>
      at Xamarin.Forms.Platform.Android.FormsAppCompatActivity:InternalSetPage <0x001b7>
      at Xamarin.Forms.Platform.Android.FormsAppCompatActivity:SetMainPage <0x00077>
      at Xamarin.Forms.Platform.Android.FormsAppCompatActivity:LoadApplication <0x0067b>
      at AnimatedGifForms.Droid.MainActivity:OnCreate <0x00143>
      at Android.App.Activity:n_OnCreate_Landroid_os_Bundle_ <0
x000ab>
      at Android.Runtime.DynamicMethodNameCounter:8 <0x000c3>
      at Android.Runtime.DynamicMethodNameCounter:8 <0x000b3>
=================================================================
[HotReload] (2020-05-29 10:24:00.4): ERROR: Caught exception in AgentStatusChangedHandler at 212: Xamarin.HotReload.DebuggerTimeoutException: Failed to Inject Assembly
   at Microsoft.VisualStudio.Telemetry.WindowsErrorReporting.WatsonReport.GetClrWatsonExceptionInfo(Exception exceptionObject)
   at Microsoft.VisualStudio.Telemetry.WindowsErrorReporting.WatsonReport.GetClrWatsonExceptionInfo(Exception exceptionObject)

这个问题一直反复出现,让人感到非常烦恼,然后程序就崩溃了。我已经升级到最新版本的Xamarin.Forms(4.6.0.772)和Essentials(1.5.3.2),但结果没有改变。


我为这个问题纠结了整整一天,一直以为自己肯定做错了什么,因为微软肯定不会发布不经过测试的动画gif支持,而实际上加载/预加载它们几乎是唯一的实现方式。但是,他们真的很糟糕。顺便感谢你在xamarin.forms的github上将其记录为一个bug:https://github.com/xamarin/Xamarin.Forms/issues/10895 - undefined

0

另一种选择是...

将您的 gif 转换为 mp4 并使用来自 XCTMediaElementhttps://github.com/xamarin/XamarinCommunityToolkit

像这样:

<xct:MediaElement WidthRequest="310"
                              HeightRequest="345"
                              BackgroundColor="Transparent"
                              AutoPlay="True"
                              ShowsPlaybackControls="False"
                              HorizontalOptions="Center"
                              IsLooping="True"
                              Source="ms-appx:///house.mp4" />

在这里阅读有关 Source 的更多信息:https://learn.microsoft.com/en-us/xamarin/community-toolkit/views/mediaelement#play-media-embedded-in-the-app-package


如果我直接设置ContentPage的内容,这是有效的。但是,如果我将MediaElement放在StackLayout或ContentView中,它不会显示 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接