Универсальный загрузчик изображений с использованием 2-х дисплеев
Как я могу добавить FadeInBitmapDisplayer и RoundedBitmapDisplayer к моему изображению?
Это мой DisplayImageOptions
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.appwidget
.cacheInMemory().displayer(new FadeInBitmapDisplayer(1500))
.build();
И можно ли как-то использовать эффект Фадеина только один раз? И если он загружен, и я прокручиваю свой список вниз и прокручиваю его снова вверх, он не исчезает во второй раз?
Заранее большое спасибо!
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
конструктору. Это позволяет вам дать одиночнымimageView
s в вашем 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);