使用 SubsamplingScaleImageView 的 Android ViewPager 在滑动图像时有时会出现黑屏

     2023-03-12     197

关键词:

【中文标题】使用 SubsamplingScaleImageView 的 Android ViewPager 在滑动图像时有时会出现黑屏【英文标题】:Android ViewPager using SubsamplingScaleImageView results in blank screen for sometime when sliding images 【发布时间】:2016-02-29 14:06:01 【问题描述】:

我使用davemorrissey's SubsamplingScaleImageView制作了一个ViewPager

滑动 ViewPager 时,下一张幻灯片会在图片加载前几秒钟内显示为空白。

有没有人遇到过同样类型的问题?任何可能的修复指针?

viewPager = (ViewPager) findViewById(R.id.pager);
magePagerAdapter adapter = new ImagePagerAdapter();       
viewPager.setAdapter(adapter);

ArrayList<String> imageFull = new ArrayList<String>();
for(int i=0;i<10;i++)
String image = "mnt/sdcard/imageDemo"+i+".jpg";
imageFull.add(image);



    @Override
    public Object instantiateItem(ViewGroup container, int position) 
      Context context = ImageGallery.this;

      SubsamplingScaleImageView fullImage = new SubsamplingScaleImageView(ImageGallery.this);
      fullImage.setImage(ImageSource.uri(imageFull.get(position)));         

      return fullImage;
   


   @Override
   public void destroyItem(ViewGroup container, int position, Object object) 
      ((ViewPager) container).removeView((SubsamplingScaleImageView) object);

   

【问题讨论】:

这是一个 SubsamplingScaleImageView 函数,用于将 SD 卡中的图像设置为 SubsamplingScaleImageView 中的背景。详情在这里 - github.com/davemorrissey/subsampling-scale-image-view imageFull 实际上是一个 String 类型的 Arraylist。我正在编辑问题。 没问题。感谢您宝贵的时间。我正在尝试理解您的答案并将其应用到我的程序中。 【参考方案1】:

您的屏幕是黑色的,因为图像尚未解码。

您可以使用:

public final void setImage(ImageSource imageSource, ImageSource previewSource)

并使用缩略图作为预览。预览会一直显示,直到图像解码完成。

请注意:

除非为主图像提供尺寸,否则无法使用预览图像。

未经测试,但类似:

Uri uri = imageFull.get(position);
Bitmap preview = MediaStore.Images.Thumbnails.getThumbnail(
                             getContentResolver(), uri,
                             MediaStore.Images.Thumbnails.MINI_KIND,
                             null);

ImageSource src = ImageSource.uri(uri);
src .dimensions(w, h); // if you don't know the size, you can just decode the bounds of your image which is quite fast

fullImage.setImage(src , ImageSource.bitmap(preview));  

如果缩略图的生成对您来说很慢,请随意在 AsyncTask 中进行。

【讨论】:

你能详细说明一下吗?如何将它与 ViewPager 代码一起使用?【参考方案2】:

我能够使用this patch 解决它。我也在visibility problem issue写了一个类似的答案

initialiseBaseLayer 被称为视图的第一个 onDraw,这就是它在页面部分可见之前不会加载的原因。

问题是在onDraw 之外进行初始化时,您将无法访问用于计算最大位图尺寸的画布:

private Point getMaxBitmapDimensions(Canvas canvas) 
    if (VERSION.SDK_INT >= 14) 
        try 
            int maxWidth = (Integer)Canvas.class.getMethod("getMaximumBitmapWidth").invoke(canvas);
            int maxHeight = (Integer)Canvas.class.getMethod("getMaximumBitmapHeight").invoke(canvas);
            return new Point(maxWidth, maxHeight);
         catch (Exception e) 
            // Return default
        
    
    return new Point(2048, 2048);

因此,您必须自己提供最大尺寸。我正在使用this function。我在活动的onCreate 期间存储该值,然后 ViewPager 获取该值。

在设置图像之前调用fullImage.setMaxDimensions(x, y) 就可以了。

它适用于 ViewPager(在我的情况下),但它不适用于 RecyclerView,因此请谨慎使用。

【讨论】:

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

】在使用加载数据流步骤的猪中,使用(使用PigStorage)和不使用它有啥区别?【英文标题】:InpigwhileusingLoaddataflowstepwhatisdifferencewithusing(UsingPigStorage)andwithoutusingit?在使用加载数据流步骤的猪中,使用(使用PigStorage)和不使用它... 查看详情

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

】MySQLdb在按日期排序时使用“使用位置;使用临时;使用文件排序”【英文标题】:MySQLdbisusing"Usingwhere;Usingtemporary;Usingfilesort"whensortingbydate【发布时间】:2011-07-2207:56:47【问题描述】:我有一个包含一堆记录的数据库,... 查看详情

如何使用 AutoMapper 使用 EntityFramework 使用嵌套列表更新对象?

】如何使用AutoMapper使用EntityFramework使用嵌套列表更新对象?【英文标题】:HowtouseAutoMapperforupdatingObjectwithnestedListusingEntityFramework?【发布时间】:2022-01-0315:40:44【问题描述】:我想使用AutoMapper将带有嵌套列表的EntityDto映射到实体... 查看详情

qt静态编译时使用openssl有三种方式(不使用,动态使用,静态使用,默认是动态使用)

WhencompilingQtyoucanchooseoneoftheseoptionsbasedontheconfigurecommandline:noOpenSSLsupport(-no-openssl)QtNetworkdynamicallyopeningOpenSSLlibs(-openssl;default)QtNetworklinkingtoOpenSSL(-openssl-linke 查看详情

何时使用自旋锁?何时使用互斥体?

中断上下文只能使用自旋锁。任务睡眠时只能使用互斥体。需求建议的加锁方法低开销加锁优先使用自旋锁短期锁定优先使用自旋锁长期加锁优先使用互斥体中断上下文加锁使用自旋锁持有锁需要睡眠使用互斥体  查看详情

kettlejava脚本组件的使用说明(简单使用升级使用)

文章目录前言Kettlejava脚本组件的使用说明(简单使用、升级使用)01简单使用02升级使用前言  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^_^。  而且听说点赞的人每天的运气... 查看详情

使用pidstat监控资源使用

 linux可以使用pidstat命令监控系统资源,比如监控cup使用如下:pidstat-u1还可以使用-r(内存)-d(硬盘) 查看详情

如何使用公钥加密字符串并使用 MimeKit 使用私钥解密?

】如何使用公钥加密字符串并使用MimeKit使用私钥解密?【英文标题】:HowtoencryptstringwithpublickeyanddecryptusingprivatekeyusingMimeKit?【发布时间】:2021-04-0118:27:35【问题描述】:我很难寻找有关如何使用公钥证书加密字符串并使用Mimekit... 查看详情

如何使用 webpack 使用它

】如何使用webpack使用它【英文标题】:Howtoconsumethiswithwebpack【发布时间】:2015-10-1405:17:20【问题描述】:如何在webpackreact应用程序中使用这个repo:https://github.com/chris-rudmin/Recorderjs我已经创建了一个新的库并以es6模块样式导出主... 查看详情

使用 C++ 和 Boost(或不使用?)检查是不是正在使用特定端口?

】使用C++和Boost(或不使用?)检查是不是正在使用特定端口?【英文标题】:UsingC++andBoost(ornot?)tocheckifaspecificportisbeingused?使用C++和Boost(或不使用?)检查是否正在使用特定端口?【发布时间】:2016-01-2607:04:05【问题描述】:... 查看详情

Mysql查询使用索引使用文件排序使用临时

】Mysql查询使用索引使用文件排序使用临时【英文标题】:Mysqlqueryusingindexusingfilesortusingtemporary【发布时间】:2014-08-2713:58:18【问题描述】:我的数据库中有以下两个表:表1:图片列:jeid[和其他]主键:jeid行数:160万表2:媒体... 查看详情

如何使用 React 使用 Notion API

】如何使用React使用NotionAPI【英文标题】:HowtoconsumeNotionAPIwithReact【发布时间】:2021-08-0601:54:19【问题描述】:我正在尝试使用新的NotionAPI作为我个人网站的CMS。作为一种改进方法,我尝试将它与React一起使用。但它似乎不允许CO... 查看详情

如何使用@JmsListener 暂停并开始使用消息

】如何使用@JmsListener暂停并开始使用消息【英文标题】:Howtopauseandstartconsumingmessageusing@JmsListener【发布时间】:2016-07-0223:47:57【问题描述】:我使用的是SpringBoot1.3.2版。我正在使用@JmsListener为我使用JmsTemplate创建/生成的消息使用... 查看详情

为啥使用最近最少使用的简单缓存机制?

】为啥使用最近最少使用的简单缓存机制?【英文标题】:WhyistheSimpleLeastRecentlyUsedCacheMechanismused?为什么使用最近最少使用的简单缓存机制?【发布时间】:2018-03-0208:27:47【问题描述】:我使用JProfiler检查Java微服务,同时使用JMe... 查看详情

使用 Makecert 设置密钥使用属性

】使用Makecert设置密钥使用属性【英文标题】:SettingKeyUsageattributeswithMakecert【发布时间】:2011-02-2615:45:58【问题描述】:是否可以使用makecert或任何其他我可以用来生成我自己的测试证书的工具来设置密钥使用属性?我感兴趣的... 查看详情

使用 multiDexEnabled 而不使用 Gradle,而是使用 Eclipse 构建过程

】使用multiDexEnabled而不使用Gradle,而是使用Eclipse构建过程【英文标题】:UsemultiDexEnabledwithoutGradlebutEclipsebuildprocessinstead【发布时间】:2015-01-0109:14:22【问题描述】:由于最新的SDK版本,创建具有多个dex文件(https://developer.android.co... 查看详情

使用 jQuery 使用 WCF 服务

】使用jQuery使用WCF服务【英文标题】:ConsumingWCFserviceusingjQuery【发布时间】:2011-08-1023:55:33【问题描述】:到目前为止,我已经使用了Web服务,并且运行良好。我添加了一个新的WCF服务。我正在使用jQuery调用服务。这就是我使用... 查看详情

如何使用 axios 发布使用 api

】如何使用axios发布使用api【英文标题】:Howtopostconsumeanapiwithaxios【发布时间】:2021-11-2603:10:15【问题描述】:我正在使用Vue应用程序并使用Axios进行api使用。我正在尝试使用来自AWS的oauthapi来获取令牌并在其他api中使用它。但是... 查看详情