结合的CoverFlow和通用图像装载机 [英] Combining CoverFlow and Universal Image Loader

查看:224
本文介绍了结合的CoverFlow和通用图像装载机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 fancyCoverFlow 和的 universalImageLoader ,以显示我的自定义3D图库:D类似下面的画面。我的问题是,当下载的,除非我刷了画廊的图片,并从屏幕画面隐藏的,当出现下一次它显示的图像它没有显示图像,但在UniversalImageLoader样本下载的图像显示他们下载之后。

下面是我的getView $ C $下适配器:

 公开查看getView(INT的立场,观点来看,一个ViewGroup父){


    RoundedImageView照片=(RoundedImageView)视图;
    如果(照片== NULL){
        照片=(RoundedImageView)inflater.inflate(R.layout.row_gallery_latest_issue_item,父母,假);
    }
    尝试 {
        的System.out.println(测试是好的);
        ImageLoaderHelper.configureCacheableImage(mContext,照片,latestBook.get(位置).getImageUrl()
                R.drawable.avatar_issue,NULL);
    }赶上(NullPointerException异常E){
        photo.setImageResource(R.drawable.avatar_issue);
        e.printStackTrace();
    }

    返回createReflectedImages(照片);
}
 

这是完全一样UniversalImageLoader样品想到我有一个TryCatche和CreateReflectedImage(它们使我们的ImageView的反射)

,还有一件事我ImageLoaderHelper是:

 公共类ImageLoaderHelper {
公共静态无效configureCacheableImage(上下文的背景下,ImageView的ImageView的
        ,字符串IMAGEURL,整数defaultImageResourceId
        ,ImageLoadingListener imageLoadingListener){
    ImageLoader的ImageLoader的= ImageLoader.getInstance();
    DisplayImageOptions.Builder建设者=新DisplayImageOptions.Builder();
    builder.displayer(
            新SimpleBitmapDisplayer())
            .cacheOnDisc(真)
            .cacheInMemory(真)
            .resetViewBeforeLoading(真)
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
            .bitmapConfig(Bitmap.Config.RGB_565);
    如果(defaultImageResourceId!= NULL)
        builder.showImageOnFail(defaultImageResourceId).showImageForEmptyUri(defaultImageResourceId).showStubImage(defaultImageResourceId);
    如果(!imageLoader.isInited())
        imageLoader.init(ImageLoaderConfiguration.createDefault(上下文));
    imageLoader.displayImage(IMAGEURL,ImageView的,builder.build(),imageLoadingListener);
}
 

}

更新:

经过一天的调试,我发现了一个线索的问题是我的适配器,但我不知道如何解决它!

下面是$ C $了C CreateReflectedImages():

 公共ImageView的createReflectedImages(RoundedImageView图像){

    RoundedDrawable绘制=(RoundedDrawable)image.getDrawable();
    位图originalImage = drawable.toBitmap();

    INT宽度= originalImage.getWidth();
    INT高= originalImage.getHeight();

    字模=新的Matrix();
    矩阵preSCALE(1,-1)。

    位图reflectionImage = Bitmap.createBitmap(originalImage,0,
            高度/ 2,宽度,高度/ 2,矩阵,假);

    位图bitmapWithReflection = Bitmap.createBitmap(宽度,
            (高度+高度/ 2),Config.ARGB_8888);

    帆布油画=新的Canvas(bitmapWithReflection);

    canvas.drawBitmap(originalImage,0,0,NULL);

    canvas.drawBitmap(reflectionImage,0,高度,空);

    涂料粉刷=新的油漆();
    的LinearGradient着色=新的LinearGradient(0,高度,0,bitmapWithReflection.getHeight()
            ,0x70ffffff,至0x00FFFFFF,TileMode.CLAMP);

    paint.setShader(着色);

    paint.setXfermode(新PorterDuffXfermode(Mode.DST_IN));

    canvas.drawRect(0,高度,宽度,bitmapWithReflection.getHeight()
            , 涂料);

    RoundedImageView的ImageView =新RoundedImageView(mContext);
    imageView.setImageBitmap(bitmapWithReflection);
    imageView.setLayoutParams(新ImageGallery3D.LayoutParams(GeneralHelper.dp(180),GeneralHelper.dp(240))); //宽度和图像的高度
    返回ImageView的;
}
 

解决方案

现在的问题是,你有2个独立的ImageView实例左右浮动。 1在getView创建的,第二个是在createReflectedImage创建。所以基本上,当图像完成下载,一个新的ImageView已经取代了它,并下载图像加载到一个不再可见(或可能存在的话)。为什么它加载正确的第二时间(滚动屏幕外后)的理由是,延迟要低得多,因为它是被从存储器加载不脱网或任何地方,所以RoundedDrawable当可提拉=(RoundedDrawable)image.getDrawable();它实际上有你想要的,而不是仅仅是占位符的图像!

 公开查看getView(INT的立场,观点来看,一个ViewGroup父){


    RoundedImageView照片=(RoundedImageView)视图;
    ...
        / *
         *传递照片的第一个实例为ImageLoaderHelper
         * /

    ImageLoaderHelper.configureCacheableImage(mContext,照片,latestBook.get(位置).getImageUrl()
                R.drawable.avatar_issue,NULL);
    ...
    //
    //返回RoundedImageView的新实例ImageLoader的是不知道到适配器
    //
    返回createReflectedImages(照片);
}

公共ImageView的createReflectedImages(RoundedImageView图像){
    ...

    RoundedImageView的ImageView =新RoundedImageView(mContext);
    imageView.setImageBitmap(bitmapWithReflection);
    imageView.setLayoutParams(新ImageGallery3D.LayoutParams(GeneralHelper.dp(180),GeneralHelper.dp(240))); //宽度和图像的高度

    //返回ImageView的一个新实例
    返回ImageView的;
}
 

相反,在createReflectedImages返回的ImageView中,返回到图像。然后实现在传递给ImageLoaderHelper调用createReflectedImages后的图像已成功加载到你的应用效果回调。

I'm using fancyCoverFlow and universalImageLoader to display my custom 3D gallery :D something like below picture. My problem is it's not showing images when downloaded unless I swipe between the Gallery pictures and that picture hide from screen and when appears next time it's showing image But in Sample of UniversalImageLoader the downloaded image showing right after they download.

Here is my getView code for Adapter :

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

it's exactly same as UniversalImageLoader Sample expect I have a TryCatche and CreateReflectedImage ( which make our ImageView Reflective )

, And one more thing my ImageLoaderHelper is :

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

}

UPDATE :

After a day debugging I found the a Clue The problem is with My Adapter But I don't know How to resolve it !

Here is code of 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;
}

解决方案

The problem is that you have 2 separate instances of imageview floating around. 1 is created in getView, and the second is created in createReflectedImage. So basically, when the image finishes downloading, a new imageview has already replaced it and the downloaded image is loaded into one that is no longer visible (or possibly even exists). The reason why it loads correctly the second time (after scrolling offscreen) is that the latency is much lower since it is being loaded from memory not off the web or wherever, so when RoundedDrawable drawable = (RoundedDrawable) image.getDrawable(); it actually has the image that you want, rather than just the placeholder!

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;
}

Instead of returning imageView in createReflectedImages, return "image". Then implement a callback that you pass in to ImageLoaderHelper that calls createReflectedImages after the image has successfully been loaded to apply your effect.

这篇关于结合的CoverFlow和通用图像装载机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆