2015-05-30 3 views
8

Я использую fancyCoverFlow и universalImageLoader, чтобы отобразить мою собственную 3D-галерею: D что-то вроде снизу. Моя проблема заключается в том, что он не показывает изображения при загрузке, если я не прокручиваю между картинами галереи и что изображение скрывается от экрана, а когда появляется в следующий раз, когда отображается изображение. Но в образце UniversalImageLoader загруженное изображение отображается сразу после его загрузки.Объединение CoverFlow и универсального загрузчика изображений

Вот мой GetView код адаптера:

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

это точно так же, как UniversalImageLoader Sample ожидать у меня есть TryCatche и CreateReflectedImage (которые делают наше ImageView светоотражающего)

И еще одно мое ImageLoaderHelper является:

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:

После отладки дня я нашел разгадку Проблемы с моим адаптером Но я не знаю, как решить ее!

Вот код 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

Лучше переместите этот DisplayImageOptions.Builder из метода и инициализируйте его где-то в другом месте, его создание построено для каждой создаваемой новой строки. Вы также можете установить этот ImageLoadingListener, чтобы проверить, было ли загружено изображение. – razzledazzle

+0

@razzledazzle Спасибо за ваше предложение Исправить DisplayImageOptions.Builder, проверяя, не решает ли моя проблема, потому что когда я закрываю приложение (уничтожаю действие) и снова запускаю галерею действий Не показаны кешированные изображения. – Amir

ответ

1

Проблема заключается в том, что у вас есть 2 отдельные экземпляры ImageView плавающих вокруг. 1 создается в getView, а вторая создается в createReflectedImage. Таким образом, когда изображение заканчивается загрузкой, новое изображение уже заменяет его, и загруженное изображение загружается в тот, который больше не виден (или, возможно, даже существует). Причина, по которой он правильно загружается во второй раз (после прокрутки экрана), заключается в том, что время ожидания намного ниже, поскольку оно загружается из памяти не из сети или где угодно, поэтому, когда RoundedDrawable drawable = (RoundedDrawable) image.getDrawable(); на самом деле у него есть образ, который вы хотите, а не просто заполнитель!

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

Вместо того чтобы возвращать изображениеПросмотреть в createReflectedImages, вернуть «изображение». Затем выполните обратный вызов, который вы передаете в ImageLoaderHelper, который вызывает createReflectedImages после того, как изображение было успешно загружено для применения вашего эффекта.