2

我使用davemorrissey 的 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);

   }
4

2 回答 2

2

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

您可以使用:

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 中执行此操作。

于 2015-11-26T12:59:24.777 回答
1

我能够用这个补丁解决它。我也在可见性问题问题中写了一个类似的答案

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);
}

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

在设置图像调用之前fullImage.setMaxDimensions(x, y),就是这样。

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

于 2016-01-27T17:06:28.640 回答