结合 CoverFlow 和通用图像加载器
Combining CoverFlow and Universal Image Loader
我正在使用 fancyCoverFlow and universalImageLoader 来显示我的自定义 3D 画廊 :D 如下图所示。我的问题是它在下载时不显示图像,除非我在图库图片之间滑动,该图片从屏幕上隐藏,下次出现时显示图像但在 UniversalImageLoader 示例中,下载的图像在下载后立即显示。
这是我的 Adapter 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 具有反射性)
,还有一件事我的 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;
}
问题是您有 2 个独立的 imageview 实例四处浮动。 1是在getView中创建的,第二个是在createReflectedImage中创建的。所以基本上,当图像完成下载时,一个新的 imageview 已经取代它并且下载的图像被加载到一个不再可见(或者甚至可能不存在)的图像中。它第二次(在屏幕外滚动后)正确加载的原因是延迟要低得多,因为它是从内存而不是从网络或任何地方加载的,所以当 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;
}
而不是 return 在 createReflectedImages 中使用 imageView,return "image"。然后实现一个回调,您将其传递给 ImageLoaderHelper,在成功加载图像以应用您的效果后调用 createReflectedImages。
我正在使用 fancyCoverFlow and universalImageLoader 来显示我的自定义 3D 画廊 :D 如下图所示。我的问题是它在下载时不显示图像,除非我在图库图片之间滑动,该图片从屏幕上隐藏,下次出现时显示图像但在 UniversalImageLoader 示例中,下载的图像在下载后立即显示。
这是我的 Adapter 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 具有反射性)
,还有一件事我的 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;
}
问题是您有 2 个独立的 imageview 实例四处浮动。 1是在getView中创建的,第二个是在createReflectedImage中创建的。所以基本上,当图像完成下载时,一个新的 imageview 已经取代它并且下载的图像被加载到一个不再可见(或者甚至可能不存在)的图像中。它第二次(在屏幕外滚动后)正确加载的原因是延迟要低得多,因为它是从内存而不是从网络或任何地方加载的,所以当 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;
}
而不是 return 在 createReflectedImages 中使用 imageView,return "image"。然后实现一个回调,您将其传递给 ImageLoaderHelper,在成功加载图像以应用您的效果后调用 createReflectedImages。