Сочетание CoverFlow и Универсального загрузчика изображений

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

Вот мой код 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. Ожидайте, что у меня есть TryCatche и CreateReflectedImage (которые делают наш ImageView Reflective)

И еще одна вещь, которую мой 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);
}

}

ОБНОВИТЬ:

После дневной отладки я обнаружил подсказку. Проблема с моим адаптером, но я не знаю, как ее решить!

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

1 ответ

Решение

Проблема в том, что у вас есть 2 отдельных экземпляра изображения, плавающих вокруг. 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;
}

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

Другие вопросы по тегам