2014-12-04 62 views
3

的占位符从视UX点,这将是巨大的,缩略图首先显示的用户,直到真正的图像完成加载,那么它展示给他,但Picasso只使用一个资源文件如下所示:使用缩略图作为毕加索

Picasso.with(context) 
    .load(url) 
    .placeholder(R.drawable.user_placeholder) 
    .into(imageView); 

那么,如何使用缩略图URL作为占位符? ,如果我应该两次使用毕加索,那么如何?

An issue已经在毕加索的github页面上打开了这个请求,但似乎不会按照JakeWharton将其添加到毕加索。那么我们怎么能够用手里有的东西来做呢?

+0

是由设计有关手动设置的ImageView缩略图什么。您不使用毕加索的占位符选项。然后你有缩略图,直到它被加载。 – akohout 2014-12-04 17:07:34

+0

你是什么意思手动? – AbdelHady 2014-12-04 18:08:43

回答

23

由于乌鸦在这里&在original request GitHub上的评论,最后我有一个有效的解决方案:

Picasso.with(context) 
     .load(thumb) // thumbnail url goes here 
     .into(imageView, new Callback() { 
      @Override 
      public void onSuccess() { 
       Picasso.with(context) 
         .load(url) // image url goes here 
         .placeholder(imageView.getDrawable()) 
         .into(imageView); 
      } 
      @Override 
      public void onError() { 

      } 
     }); 

这里的技巧是让从ImageView的提拉(这是缩略图)后的第一个电话&把它作为一个占位符,第二个呼叫

- 更新 -

我做了一个blog post描述整个场景

3

你可以写一个简单的辅助这就要求毕加索两次(如你所提到的)。

我没有测试它,但它应该像

Picasso.with(context) 
     .load(thumbnailUrl) 
     .error(errorPlaceholderId) 
     .into(imageView, new Callback() { 
         @Override 
         public void onSuccess() { 
           // TODO Call Picasso once again here 
         } 

         @Override 
         public void onError() {        
        } 
      ); 

有几种不同的方式让你的毕加索叫了两声。我可以想到的一个方法(再次未经测试)是

public static void loadImageWithCallback(String url, Callback callback) { 
    Picasso.with(context) 
     .load(url) 
     .error(errorPlaceholderId) 
     .into(imageView, callback); 
} 

public static void loadImage(String url) { 
    Picasso.with(context) 
     .load(url) 
     .error(errorPlaceholderId) 
     .into(imageView); 
} 

loadImageWithCallback("http://example.com/mythumbnail.jpg", new Callback() { 

        @Override 
        public void onSuccess() { 
         loadImage("http://example.com/myRealImage.jpg");  
        } 

        @Override 
        public void onError() {        
       } 
} 

编辑:我所知道的是,毕加索提供了这种回调机制。我在我的应用程序中使用它来隐藏显示的图像,直到图像加载。我会在成功或错误回调中隐藏它 - 因此您可以选择在图像加载完成时收到通知。然后你可以简单地再次调用它。我希望上述方法有效。

+0

不久,它不工作。不幸的是,看起来毕加索在绑定到ImageView时清除了ImageView,所以当调用onSuccess()时试图绑定第二次调用,清除已加载的大拇指!我认为我们需要从第一次调用中获取位图,并将其作为下一个占位符传递给它,但是如何? ! – AbdelHady 2014-12-07 10:41:03

1

我最初使用AbdelHady的解决方案,但发现该缩略图加载完成后,所以我想出了这个,而不是更大的图像仅加载。

假设你在你的项目中的实用工具类;

public final class U { 

public static void picassoCombo(final RequestCreator thumbnail, 
           final RequestCreator large, 
           final ImageView imageView) { 
    Target target = new Target() { 
     @Override 
     public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
      imageView.setImageBitmap(bitmap); 
     } 

     @Override 
     public void onBitmapFailed(Drawable errorDrawable) { 
      imageView.setImageDrawable(errorDrawable); 
     } 

     @Override 
     public void onPrepareLoad(Drawable placeHolderDrawable) { 
      thumbnail.into(imageView); 
     } 
    }; 

    imageView.setTag(target); // To prevent target from being garbage collected 
    large.into(target); 
} 
} 

用法:

U.picassoCombo(
     Picasso.with(context) 
       .load("http://lorempixel.com/200/100/sports/1/") 
       .placeholder(R.drawable.ic_image_placeholder), 
     Picasso.with(context) 
       .load("http://lorempixel.com/800/400/sports/1/") 
       .error(R.drawable.ic_image_broken), 
     imageView 
); 

在占位符被设定的第一,缩略图URL被设置在下一个上述例子中,和不管缩略图请求是否完成,成功,还是失败,大图像请求在完成后设置。如果大图像请求失败,则设置可绘制错误。

唯一的问题是,如果你使用setIndicatorsEnabled(true)调试指标没有显示对大的请求。据我可以告诉这似乎根据this issue convo