【问题标题】:Viewpager show two images, high and low res, screen black during loadingViewpager 显示两个图像,高分辨率和低分辨率,加载过程中屏幕黑屏
【发布时间】:2012-12-14 18:54:13
【问题描述】:

再次面临一个“奇怪”的问题。

我使用 Viewpager 来显示 2 个单独的图像(Viewpager 仅包含一个布局和 2 个图像视图)。 这个概念是,从本地文件缓存中(立即)显示一个低分辨率图像,同时加载高分辨率图片并显示它。

问题是:只使用低分辨率图片,图片立即显示,一切都很完美,但只要启用高分辨率图片(显示), 如果用户快速滑动,屏幕会在“短时间内”(500 毫秒到 1.5 秒)保持黑色,并且永远不会显示低分辨率图像。 只是高分辨率的图片..

也许有人遇到过类似的问题,请提供任何帮助 :) 谢谢!

ViewPager 代码:

/**
 * Create and add a new page of the image at the given position.
 * 
 * @param collection
 * @param position
 */
@Override
public Object instantiateItem (View collection, final int position) {

    Log.v(TAG, "instantiateItem: pos: " +position);

    final Context context = collection.getContext();


    RelativeLayout layout = new RelativeLayout(context);
    ImageViewTouch imageView = new ImageViewTouch(context);
    ImageViewTouch imageView2 = new ImageViewTouch(context);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT);

    layout.addView(imageView, lp);        
    layout.addView(imageView2, lp);

    imageView.setOnSingleTapConfirmedListener((OnImageViewSingleTapConfirmedListener) context);
    imageView2.setOnSingleTapConfirmedListener((OnImageViewSingleTapConfirmedListener) context);
    imageView2.setVisibility(View.GONE);

    if (position == restorePageNumber) {
        loadBitmap(context, position, imageView, imageView2, restoreZoomLevel);

        Log.w(TAG, "zoom level regocnized for pos: " + position + " resetting...");
        restorePageNumber = Constants.INVALID_INT;
        restoreZoomLevel = Constants.INVALID_LONG;          
    } else {
        loadBitmap(context, position, imageView, imageView2, Constants.INVALID_LONG);
    }

    imageView.setFitToScreen(true);
    imageView2.setFitToScreen(true);

    activePages.put(position, imageView2);
    ((ViewPager) collection).addView(layout);


    return layout;
}
protected void loadBitmap (Context context, int position, 
  ImageViewTouch imageView, ImageViewTouch imageView2, 
  float restoreZoomLevel) {
    Photo photo = getPhotoAtPosition(position);
    Log.v(TAG, "loading photo. pos: " + position + " id: " + photo.getId());
    // show small image first
    if (!(photo instanceof CameraPhoto)) {
        StorageManager.retrieveBitmapBackgroundWithImageview(context, photo,
                Photo.SIZE_SMALL, imageView, true, Constants.INVALID_LONG);
    }
    // afterwards replace with big image
    StorageManager.retrieveBitmapBackgroundWithImageview(context, photo,
            Photo.SIZE_LARGE, imageView2, true, restoreZoomLevel);
}

在那些方法(retrieveBitmapBackgroundWithImageview)中,图片在后台加载,然后设置为imageview。

似乎设置大位图有问题。 即使带有大位图的 Imageview 保持隐藏 (View.GONE),并且只显示本地缓存图像,如果快速滑动,ViewPager 也会在加载页面时保持黑色一段时间(如上,500ms 到 1.5s): )

谢谢 :)

【问题讨论】:

    标签: android image background loading android-viewpager


    【解决方案1】:

    如果您的意思是快速滑动到很多页面,它只是在加载所有这些视图时遇到问题。您是否取消/中断超出 ViewPager 范围的 loadBitmap 任务(不在视图或缓存中)?

    而且,您在线程中处理并发吗?如果您总是想首先加载位于ViewPager's 视图或缓存中的页面,则应覆盖Comparator 并让它在页面上进行比较。比较器可用于PriorityBlockingQueue,后者可用于Executor

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      相关资源
      最近更新 更多