Универсальный загрузчик изображений с использованием 2-х дисплеев


Как я могу добавить FadeInBitmapDisplayer и RoundedBitmapDisplayer к моему изображению?

Это мой DisplayImageOptions

options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.appwidget
.cacheInMemory().displayer(new FadeInBitmapDisplayer(1500))
.build();

И можно ли как-то использовать эффект Фадеина только один раз? И если он загружен, и я прокручиваю свой список вниз и прокручиваю его снова вверх, он не исчезает во второй раз?

Заранее большое спасибо!

3 4

3 ответа:

Как я могу добавить FadeInBitmapDisplayer и RoundedBitmapDisplayer к моему изображению?

Ни в коем случае в текущей версии. Вы можете создать свой собственный displayer (extend BitmapDisplayer) и скопировать код из FadeInBitmapDisplayer и RoundedBitmapDisplayer в свой класс.

И можно ли как-то использовать эффект FadeIn раз?

Почти все возможно :) но это будет не так удобно.

Вы можете сохранить URL-адреса отображаемых изображений в некоторые карты (Map<String, Boolean> = [Image URLisDisplayed]) и проверить эту карту перед вызовом imageLoader.displayImage(...). Если изображения для текущего URL-адреса на карте (т. е. изображение), а затем использовать варианты только с RoundedBitmapDisplayer. Если изображение для текущего URL не находится на карте, то используйте опции с fadeinbitmapdisplayer+RoundedBitmapDisplayer displayer.

Как я могу добавить FadeInBitmapDisplayer и RoundedBitmapDisplayer в мой образ?

Также была эта проблема. Я использовал замечательное предложение Ностры, и вот мой пользовательский класс:

public class FadeInRoundedBitmapDisplayer extends RoundedBitmapDisplayer {

    int durationMillis;
    String noRoundedCornersTag;

    public FadeInRoundedBitmapDisplayer(int durationMillis, int roundPixels,
            String noRoundedCornersTag) {
        super(roundPixels);
        this.durationMillis = durationMillis;
        this.noRoundedCornersTag = noRoundedCornersTag;
    }

    @Override
    public Bitmap display(Bitmap bitmap, ImageView imageView,
            LoadedFrom loadedFrom) {
        imageView.setImageBitmap((imageView.getTag() != null && imageView
                .getTag().equals(noRoundedCornersTag)) ? bitmap : super
                .display(bitmap, imageView, loadedFrom));

        animate(imageView, durationMillis);

        return bitmap;
    }

    public static void animate(ImageView imageView, int durationMillis) {
        AlphaAnimation fadeImage = new AlphaAnimation(0, 1);
        fadeImage.setDuration(durationMillis);
        fadeImage.setInterpolator(new DecelerateInterpolator());
        imageView.startAnimation(fadeImage);
    }

}

Вы можете передать String noRoundedCornersTag конструктору. Это позволяет вам дать одиночным imageViews в вашем XML-макете этот тег, чтобы пропустить процедуру углового радиуса (хорошо для фоновых изображений и т. д.), например:

<ImageView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:tag="@string/no_rounded_corners_tag" />

Вызов конструктора будет выглядеть следующим образом:

new FadeInRoundedBitmapDisplayer(Constants.IMAGE_FADING_TIME,
  getResources().getDimension(R.dimen.image_corner_radius),
  getResources().getString(R.string.no_rounded_corners_tag))

Мне пришлось обновить решение @saschoar, так как оно не работало с текущей версией Universal Image Loader (1.9.4). Решение очень похоже. Взгляните:

public class FadeInRoundedBitmapDisplayer extends RoundedBitmapDisplayer {

    int durationMillis;

    public FadeInRoundedBitmapDisplayer(int durationMillis, int roundPixels) {

        super(roundPixels);
        this.durationMillis = durationMillis;
    }

    @Override
    public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {

        super.display(bitmap, imageAware, loadedFrom);

        animate(imageAware.getWrappedView(), durationMillis);
    }

    public static void animate(View imageView, int durationMillis) {

        AlphaAnimation fadeImage = new AlphaAnimation(0, 1);
        fadeImage.setDuration(durationMillis);
        fadeImage.setInterpolator(new DecelerateInterpolator());
        imageView.startAnimation(fadeImage);
    }
}

Вы можете использовать это решение для определения DisplayImageOptions следующим образом:

    DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
        .displayer(new FadeInRoundedBitmapDisplayer(3000, 1000))
        .build();

    ImageLoader imageLoader = ImageLoader.getInstance();
    imageLoader.displayImage(imageUrl, imageView, displayImageOptions);