2015-05-30 15 views
8

Tôi đang sử dụng fancyCoverFlowuniversalImageLoader để hiển thị thư viện 3D tùy chỉnh của tôi: D giống như hình dưới đây. Vấn đề của tôi là nó không hiển thị hình ảnh khi được tải xuống trừ khi tôi vuốt giữa các hình ảnh trong Thư viện và hình ảnh đó ẩn khỏi màn hình và khi xuất hiện lần sau khi hiển thị hình ảnh Nhưng trong Mẫu của UniversalImageLoader, hình ảnh đã tải xuống hiển thị ngay sau khi tải xuống.Kết hợp CoverFlow và Universal Image Loader

Đây là mã getView của tôi cho bộ kết nối:

public View getView(int position, View view, ViewGroup parent) { 


    RoundedImageView photo = (RoundedImageView) view; 
    if (photo == null) { 
     photo = (RoundedImageView) inflater.inflate(R.layout.row_gallery_latest_issue_item, parent, false); 
    } 
    try { 
     System.out.println("Test is good"); 
     ImageLoaderHelper.configureCacheableImage(mContext, photo, latestBook.get(position).getImageUrl(), 
       R.drawable.avatar_issue, null); 
    } catch (NullPointerException e) { 
     photo.setImageResource(R.drawable.avatar_issue); 
     e.printStackTrace(); 
    } 

    return createReflectedImages(photo); 
} 

nó là chính xác giống như UniversalImageLoader mẫu mong đợi Tôi có một TryCatche và CreateReflectedImage (mà làm cho ImageView của chúng tôi phản quang)

, Và một điều nữa ImageLoaderHelper của tôi là:

public class ImageLoaderHelper { 
public static void configureCacheableImage(Context context, ImageView imageView 
     , String imageUrl, Integer defaultImageResourceId 
     , ImageLoadingListener imageLoadingListener) { 
    ImageLoader imageLoader = ImageLoader.getInstance(); 
    DisplayImageOptions.Builder builder = new DisplayImageOptions.Builder(); 
    builder.displayer(
      new SimpleBitmapDisplayer()) 
      .cacheOnDisc(true) 
      .cacheInMemory(true) 
      .resetViewBeforeLoading(true) 
      .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
      .bitmapConfig(Bitmap.Config.RGB_565); 
    if (defaultImageResourceId != null) 
     builder.showImageOnFail(defaultImageResourceId).showImageForEmptyUri(defaultImageResourceId).showStubImage(defaultImageResourceId); 
    if (!imageLoader.isInited()) 
     imageLoader.init(ImageLoaderConfiguration.createDefault(context)); 
    imageLoader.displayImage(imageUrl, imageView, builder.build(), imageLoadingListener); 
} 

}

enter image description here

UPDATE:

Sau một gỡ lỗi ngày nào đó tôi tìm thấy một Clue Vấn đề là với Adaptor của tôi Nhưng tôi không biết thế nào để giải quyết nó!

Đây là mã của CreateReflectedImages():

public ImageView createReflectedImages(RoundedImageView image) { 

    RoundedDrawable drawable = (RoundedDrawable) image.getDrawable(); 
    Bitmap originalImage = drawable.toBitmap(); 

    int width = originalImage.getWidth(); 
    int height = originalImage.getHeight(); 

    Matrix matrix = new Matrix(); 
    matrix.preScale(1, -1); 

    Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, 
      height/2, width, height/2, matrix, false); 

    Bitmap bitmapWithReflection = Bitmap.createBitmap(width, 
      (height + height/2), Config.ARGB_8888); 

    Canvas canvas = new Canvas(bitmapWithReflection); 

    canvas.drawBitmap(originalImage, 0, 0, null); 

    canvas.drawBitmap(reflectionImage, 0, height, null); 

    Paint paint = new Paint(); 
    LinearGradient shader = new LinearGradient(0, height, 0, bitmapWithReflection.getHeight() 
      , 0x70ffffff, 0x00ffffff, TileMode.CLAMP); 

    paint.setShader(shader); 

    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 

    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() 
      , paint); 

    RoundedImageView imageView = new RoundedImageView(mContext); 
    imageView.setImageBitmap(bitmapWithReflection); 
    imageView.setLayoutParams(new ImageGallery3D.LayoutParams(GeneralHelper.dp(180), GeneralHelper.dp(240)));//width and height of Image 
    return imageView; 
} 
+0

Di chuyển tốt hơn mà DisplayImageOptions.Builder ra khỏi phương pháp và khởi tạo nó ở một nơi khác, nó được xây dựng cho mỗi hàng mới được tạo ra. Bạn cũng có thể đặt ImageLoadingListener đó để kiểm tra xem hình ảnh đã được tải xuống chưa. – razzledazzle

+0

@razzledazzle Cảm ơn đề xuất của bạn Tôi sửa DisplayImageOptions.Builder, kiểm tra không giải quyết được sự cố của tôi vì khi tôi đóng ứng dụng (hủy hoạt động) và bắt đầu lại thư viện hoạt động Không hiển thị được lưu trữ Hình ảnh đã được tải xuống. – Amir

Trả lời

1

Vấn đề là bạn có 2 trường hợp riêng biệt của ImageView nổi xung quanh. 1 được tạo trong getView và phần thứ hai được tạo trong createReflectedImage. Vì vậy, về cơ bản, khi hình ảnh kết thúc tải xuống, một lần xem hình ảnh mới đã được thay thế và hình ảnh đã tải xuống được tải vào một hình ảnh không còn nhìn thấy được nữa (hoặc thậm chí có thể tồn tại). Lý do tại sao nó tải chính xác lần thứ hai (sau khi di chuyển offscreen) là độ trễ là thấp hơn nhiều vì nó đang được nạp từ bộ nhớ không tắt web hoặc bất cứ nơi nào, vì vậy khi RoundedDrawable drawable = (RoundedDrawable) image.getDrawable(); nó thực sự có hình ảnh mà bạn muốn, thay vì chỉ là trình giữ chỗ!

public View getView(int position, View view, ViewGroup parent) { 


    RoundedImageView photo = (RoundedImageView) view; 
    ... 
     /* 
     *Passing first instance of photo into ImageLoaderHelper 
     */ 

    ImageLoaderHelper.configureCacheableImage(mContext, photo, latestBook.get(position).getImageUrl(), 
       R.drawable.avatar_issue, null); 
    ... 
    // 
    //Returns the new instance of RoundedImageView that ImageLoader is not aware of to the adapter 
    // 
    return createReflectedImages(photo); 
} 

public ImageView createReflectedImages(RoundedImageView image) { 
    ... 

    RoundedImageView imageView = new RoundedImageView(mContext); 
    imageView.setImageBitmap(bitmapWithReflection); 
    imageView.setLayoutParams(new ImageGallery3D.LayoutParams(GeneralHelper.dp(180), GeneralHelper.dp(240)));//width and height of Image 

    //Returning a new instance of imageView 
    return imageView; 
} 

Thay vì trả về hình ảnhXem trong createReflectedImages, trả về "hình ảnh". Sau đó, thực hiện một cuộc gọi lại mà bạn chuyển vào ImageLoaderHelper để gọi createReflectedImages sau khi hình ảnh đã được tải thành công để áp dụng hiệu ứng của bạn.