Windows phone 8 如何在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()) { //我不指定类型,因为我也想加载其他类型的图像

我试图显示存储在Windows Phone 8.1(RT)应用程序本地文件夹中的GIF文件。到目前为止,我已经尝试了几种方法:

  • 在WebView控件中加载GIF。这不是一个解决方案,因为我想在FlipView控件中显示图像(我无法切换到其他图像)。而且,它相当慢

  • 使用BitmapDecoder类获取GIF帧,并使用故事板对其设置动画

    代码如下:

  • 使用(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
      Source
      当前不可见,则将其设置为null(检查翻转视图的
      SelectedIndex
      )。请注意,当前my repo中的代码没有处理将
      Source
      设置为null的操作。就像我之前说的,它需要很多改进。您必须确保控件不保留对帧的任何引用,以便垃圾收集器可以从内存中释放它们(即,调用
      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,如何在翻转该项后释放内存?再次感谢您抽出时间!