2015-07-16 2 views
11

Может ли кто-нибудь указать мне на пример того, как можно сфокусировать фон в формате XML с помощью Picasso? Все примеры, которые я нашел, могут обновлять ImageView с помощью Picasso, но не с фоном макета.Как загрузить фоновый рисунок с использованием Picasso

Unable to set LinearLayout BackgroundResource from URL using Picasso

ответ

22

Вы можете использовать Target Пикассо:

  Picasso.with(this).load("http://imageUrl").into(new Target() { 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
       mYourLayout.setBackground(new BitmapDrawable(bitmap)); 
      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 

      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 

      } 
     }); 

UPDATE

Как @BladeCoder упоминалось в комментариях, Пикассо держит слабую ссылку на целевые объекты, поэтому он, скорее всего, собирать мусор.

Итак, следуя Jake Wharton's comment на один из вопросов, я думаю, что это может быть хорошим способом пойти:

CustomLayout mCustomLayout = (CustomLayout)findViewById(R.id.custom_layout) 
    Picasso.with(this).load("http://imageUrl").into(mCustomLayout); 

CustomLayout.java:

public class CustomLayout extends LinearLayout implements Target { 

    public CustomLayout(Context context) { 
     super(context); 
    } 

    public CustomLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 


    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     setBackground(new BitmapDrawable(getResources(), bitmap)); 
    } 

    @Override 
    public void onBitmapFailed(Drawable errorDrawable) { 
     //Set your error drawable 
    } 

    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) { 
     //Set your placeholder 
    } 
} 
+1

код этого примера не всегда может работать: вы * * должны держать жесткую ссылку на ваш 'Target' или это может быть сборщиком мусора перед загрузкой изображений, поскольку Пикассо продолжает слабый ссылки на целевые объекты. – BladeCoder

+0

@BladeCoder Вы правы. Я редактирую свой ответ, чтобы решить эту проблему. Спасибо – mmark

+0

У меня возникли проблемы с использованием цели Пикассо, как вы показали выше ... (любая помощь оценивается) http://pastebin.com/uY2LnSDV – AndroidAndroidAndroid

4

Я использую ImageView в качестве временного ImageHolder , Сначала загрузите изображение с помощью picasso в ImageView и установите Layout Background из этого ImageView с помощью getDrawable.

   ImageView img = new ImageView(this); 
       Picasso.with(this) 
       .load(imageUri) 
       .fit() 
       .centerCrop() 
       .into(img, new Callback() { 
         @Override 
         public void onSuccess() { 

          myLayout.setBackgroundDrawable(img.getDrawable()); 
         } 

         @Override 
         public void onError() { 

         } 
        }); 
+0

Не лучшее решение, но решение тем не менее. – stevyhacker

1

В моем случае мне нужно изображение, чтобы соответствовать размеру в ImageView, с тем вместо загрузки изображения в фоновом режиме я добавил это свойство в ImageView и загрузить изображение в обычном режиме.

android:scaleType="fitXY" 
0

Ни одно из вышеперечисленных решений не работало для меня. Но решение Тихи было самым близким. Ниже работал для меня:

final ImageView img = new ImageView(this); 
Picasso.with(img.getContext()) 
.load(url) 
.into(img, new com.squareup.picasso.Callback() { 
@Override 
public void onSuccess() { 
collapsingToolbarLayout.setBackgroundDrawable(img.getDrawable()); 
} 

@Override 
public void onError() { 
} 
}); 
Смежные вопросы