使用2个显示器的通用图像加载器

时间:2012-12-01 17:39:27

标签: android universal-image-loader

如何将FadeInBitmapDisplayer和RoundedBitmapDisplayer添加到我的图像?

这是我的DisplayImageOptions

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

是否有可能以某种方式仅使用FadeIn效果一次?如果它已加载,我向下滚动列表并再次向上滚动它不会再次出现FadeIn?

提前多多谢谢!

3 个答案:

答案 0 :(得分:11)

  

如何将FadeInBitmapDisplayer和RoundedBitmapDisplayer添加到我的图像?

当前版本没有办法。您可以创建自己的显示器(扩展BitmapDisplayer)并将代码从FadeInBitmapDisplayer和RoundedBitmapDisplayer复制到您的类中。

  

是否有可能以某种方式仅使用FadeIn效果一次?

几乎一切皆有可能:)但它不会那么方便。

您可以将显示的图片网址保留在某个地图中(Map<String, Boolean> = [图片网址&lt; - &gt; isDisplayed])并在imageLoader.displayImage(...)调用之前检查此地图。如果当前URL的图像在Map中(即显示图像),则使用仅包含RoundedBitmapDisplayer的选项。如果当前URL的图像不在Map中,则使用FadeInBitmapDisplayer + RoundedBitmapDisplayer显示器的选项。

答案 1 :(得分:5)

  

如何添加FadeInBitmapDisplayer和RoundedBitmapDisplayer到   我的形象?

也有这个问题。我使用了NOSTRA的好建议,这是我的自定义类:

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传递给构造函数。这使您可以在XML布局中为单个imageView提供标记以跳过角半径过程(适用于背景图像等),例如:

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

答案 2 :(得分:3)

我不得不更新@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);