Android 使用 SubsamplingScaleImageView 的 ViewPager 在滑动图像时导致黑屏一段时间
Android ViewPager using SubsamplingScaleImageView results in blank screen for sometime when sliding images
我使用 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);
}
您的屏幕是黑色的,因为图像尚未解码。
您可以使用:
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 中执行此操作。
我可以通过 this patch. I also wrote a similar answer in the visibility problem issue
解决这个问题
initialiseBaseLayer
被称为视图的第一个 onDraw
,这就是为什么它在页面部分可见之前不会加载的原因。
问题是在 onDraw
之外初始化您无法访问用于计算最大位图尺寸的 canvas:
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。我在 activity 的 onCreate
期间存储值,然后 ViewPager 获取该值。
在设置图像调用之前fullImage.setMaxDimensions(x, y)
就是这样。
它适用于 ViewPager(在我的例子中),但不适用于 RecyclerView,因此请谨慎使用。
我使用 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);
}
您的屏幕是黑色的,因为图像尚未解码。
您可以使用:
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 中执行此操作。
我可以通过 this patch. I also wrote a similar answer in the visibility problem issue
解决这个问题initialiseBaseLayer
被称为视图的第一个 onDraw
,这就是为什么它在页面部分可见之前不会加载的原因。
问题是在 onDraw
之外初始化您无法访问用于计算最大位图尺寸的 canvas:
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。我在 activity 的 onCreate
期间存储值,然后 ViewPager 获取该值。
在设置图像调用之前fullImage.setMaxDimensions(x, y)
就是这样。
它适用于 ViewPager(在我的例子中),但不适用于 RecyclerView,因此请谨慎使用。