2014-12-04 64 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