Windows phone 8 如何在Windows Phone 8.1(RT)应用程序中显示动画GIF?
我试图显示存储在Windows Phone 8.1(RT)应用程序本地文件夹中的GIF文件。到目前为止,我已经尝试了几种方法:Windows phone 8 如何在Windows Phone 8.1(RT)应用程序中显示动画GIF?,windows-phone-8,windows-runtime,winrt-xaml,windows-phone-8.1,win-universal-app,Windows Phone 8,Windows Runtime,Winrt Xaml,Windows Phone 8.1,Win Universal App,我试图显示存储在Windows Phone 8.1(RT)应用程序本地文件夹中的GIF文件。到目前为止,我已经尝试了几种方法: 在WebView控件中加载GIF。这不是一个解决方案,因为我想在FlipView控件中显示图像(我无法切换到其他图像)。而且,它相当慢 使用BitmapDecoder类获取GIF帧,并使用故事板对其设置动画 代码如下: 使用(var stream=await-storageFile.OpenReadAsync()) { //我不指定类型,因为我也想加载其他类型的图像
使用(var stream=await-storageFile.OpenReadAsync())
{
//我不指定类型,因为我也想加载其他类型的图像
//如果我使用“BitmapDecoder.gifDecodeGrid”没有任何区别
var解码器=等待BitmapDecoder.CreateAsync(流);
uint frameCount=decoder.frameCount;
对于(uint frameIndex=0;frameIndex
问题是我从GIF图像中获得的帧被弄乱了
我在这种方法上做错了什么吗?为了得到好的结果,我应该修改什么
我不想使用SharpDX,因为它看起来很复杂,而且我是个初学者
ImageTools仅适用于Silverlight我制作了一个非常基本的GifImage
控件,您可以从它开始这是一个起点,您必须对其进行改进,使其更易于作为可重用控件使用。看看吧
编辑 你知道如何提高加载速度(并行化等)吗 我想你指的是准备框架的过程。从我测试的情况来看,它似乎是立即加载的,所以不需要大幅提高性能。然而,如果动画可能有数百帧,那么它可能是一个瓶颈?需要进行更多的测试,以评估是否需要进行优化 我也不认为它可以很容易地并行,因为每个帧都需要从上一帧开始按顺序渲染。我唯一的建议是在后台线程上运行加载代码,这样UI线程就不会阻塞大型图像 如果我将此控件作为
FlipViewItem
,如何在翻转项目后释放内存
我不确定您是否正在使用MVVM,但无论如何,这里有一些建议:
- 如果
的GifImage
当前不可见,则将其设置为null(检查翻转视图的Source
)。请注意,当前my repo中的代码没有处理将SelectedIndex
设置为null的操作。就像我之前说的,它需要很多改进。您必须确保控件不保留对帧的任何引用,以便垃圾收集器可以从内存中释放它们(即,调用Source
以清除对帧的所有引用)animation.KeyFrames.Clear()
- 在翻转视图中使用
。这将确保在内存中只创建上一个、当前和下一个翻转视图项。您可以这样设置:虚拟化StackPanel
我也有类似的问题。我试图在ScrollViewer for Windows Phone 8.1应用程序中显示从外部源加载的动画GIF。由于web控件接管了事件,因此滚动不起作用 我使用了这个技巧:我将web控件放在一个网格中,并将另一个网格放在web控件上。web控件上的网格设置为完全相同的大小,我将背景设置为透明。通过这种方式,网格接收事件并再次进行滚动
<ScrollViewer Visibility="Visible" HorizontalAlignment="Left" VerticalAlignment="Top" Width="380">
<Grid>
<StackPanel>
<!--
Some items ...
-->
<Grid >
<WebView x:Name="animationWebView" HorizontalAlignment="Left" Height="315" Width="390" Visibility="Visible" />
<Grid Width="390" Height="315" Background="Transparent" />
</Grid>
<!--
Some other items ...
-->
</StackPanel>
</Grid>
</ScrollViewer>
现在人们仍然使用动画.gif?我甚至不想提出保留它,但你可以这样做
——尽管我想如果你打算保留它,请告诉我,我会把这个作为答案,这样我可以找到一些简单的要点。:)我曾尝试向页面添加MediaElement,并将gif文件设置为其源。将AreTransportControlsEnabled
设置为true后,我可以看到错误,显示不支持的视频类型或无效的文件路径
。另外,GIF文件的路径设置正确。我可以发誓我以前用过它,也许不是吗?如果我有时间的话,我以后会把它修好的。很抱歉,这不是一个解决方案,不过…谢谢你的解决方案!我只做了一些小测试,但效果很好。你知道如何提高加载速度(并行化等)吗?此外,如果我将此控件作为FlipViewItem,如何在翻转该项后释放内存?再次感谢您抽出时间!