一次加载图像数量

Posted

技术标签:

【中文标题】一次加载图像数量【英文标题】:Load number of Images at a Time 【发布时间】:2021-05-11 16:45:14 【问题描述】:

我有大约 500 张静态图像EmbeddedResource。现在我在滑块的帮助下显示图像。所以当滑块值发生变化时,我会加载相应的图像。

        private void pageSlider_ValueChanged(object sender, ValueChangedEventArgs e)
        
            var newStep = Math.Round(e.NewValue / StepValue);

            pageSlider.Value = newStep * StepValue;
            pageNumber.Text = pageSlider.Value.ToString();
            pageImage.Source = ImageSource.FromResource("SApp.Images.SPages.page" + pageSlider.Value.ToString() + ".jpg",typeof(AboutPage).GetTypeInfo().Assembly);
        

现在,由于幻灯片对于迭代 500 张图像(总图像大小 40 MB)并不是那么用户友好,因此加载图像的正确方法是什么。 我想把它加载到Carousal control,但是当前的布局是TabbedPage,所以我不能这样做。 其他选项是将所有图像加载到ListView,但它会导致内存问题吗?或者ListViewPaging

【问题讨论】:

【参考方案1】:
    使用CollectionView 和Load data incrementally。或者通过将其包装在RefreshView 中来使用pull to refresh 功能,您将能够异步加载图像。

编辑

来自source:

CollectionView 是一个视图,用于显示使用不同布局规范的数据列表。它旨在为 ListView 提供更灵活、更高效的替代方案。

有关信息,您可以在 ListViewCollectionView 中使用 Pull to Refresh (Xamarin.Forms RefreshView)。

    此外,为了在仅限 Android 上更快地加载图像和更流畅地滚动,您可以使用 glidex.forms 包,Official repo/docs。

【讨论】:

是的。就是这个。我刚刚浏览了文档,它支持更多功能,如Context menu, Pull to refresh, Load data incrementally【参考方案2】:

我想在 Carousal 控件中加载它,但当前布局是 TabbedPage,所以我不能这样做。其他选择是将所有图像加载到 ListView,但它会导致内存问题吗?还是带分页的 ListView ?

也许您可以尝试使用FFImageLoading在ListView中显示图像,或者在silder值更新时更新图像源。

有一些特点:

    可配置的磁盘和内存缓存

    使用相同图像源(url、路径、资源)的多个图像视图将只使用一个缓存在内存中的位图(更少的内存使用)

    错误和加载占位符支持

    图像可以自动下采样到指定大小(减少内存使用)

【讨论】:

按照 Cfun 的建议,CollectionView 怎么样。 @Rauf 建议你用ListView来做,因为ListView有ListViewCachingStrategy属性,RecycleElement缓存策略指定ListView会尽量减少通过回收列表单元来实现其内存占用和执行速度。 CollectionView automatically uses the virtualization provided by the underlying native controls.

以上是关于一次加载图像数量的主要内容,如果未能解决你的问题,请参考以下文章

imgaug:加载和保存图像

如果敌人数量为零,则加载下一个级别

根据列表中图像的数量按比例调整动态图像列表的大小

使用 ImageMagick C++ API 读取 PDF 中的页面数量,而不读取所有图像

如何在收到一定数量的数据后调用 Web 服务并将其加载到表格视图中

CSS Sprite 图像和响应式设计。它是不是同时加载全尺寸和响应尺寸?