Как загрузить макет фона с помощью Picasso
Может кто-нибудь указать мне на пример того, как можно программно изменить фон XML-макета с помощью Picasso? Все примеры, которые я нашел, могут обновлять ImageView, используя Пикассо, но не фон макета.
Невозможно установить LinearLayout BackgroundResource из URL с помощью Picasso
6 ответов
Вы можете использовать цель Пикассо:
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) {
}
});
ОБНОВИТЬ
Как упомянуто в комментарии @BladeCoder, в Picasso содержится слабая ссылка на объекты Target, поэтому он, вероятно, будет собирать мусор.
Итак, после комментария Джейка Уортона по одному из вопросов, я думаю, что это может быть хорошим решением:
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
}
}
Я использую 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() {
}
});
Ни одно из приведенных выше решений не помогло мне. Но решение @ Тихи было самым близким. Ниже работает для меня:
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() {
}
});
Вы можете попробовать это, это отлично работает для меня.
// я использовал относительный макет в своей деятельности
private RelativeLayout chatBG;
//инициализируем ваш макет
chatBG = findViewById(R.id.chat_activity);
//используя библиотеку picasso, лучше использовать ее в методе onStart(), чтобы избежать некоторых ошибок
Picasso.get().load("https://your/url")
.placeholder(R.drawable.yourplaceholder_img)
.into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
chatBG.setBackground(new BitmapDrawable(bitmap));
}
@Override
public void onBitmapFailed(Exception e, Drawable errorDrawable) {
Toast.makeText(ChatActivity.this, "Error : loading wallpaper", Toast.LENGTH_SHORT).show();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
В моем случае мне нужно, чтобы изображение соответствовало размеру изображения, поэтому вместо загрузки изображения в фоновом режиме я добавил это свойство в изображение и загрузил изображение в обычном режиме.
android:scaleType="fitXY"
В качестве альтернативы предыдущим ответам. Можно установить фон через Piccasso, просто создав ImageView с соответствующим родителем в макете.
XML:
<ImageView
android:id="@+id/imageView_background"
android:layout_width="match_parent"
android:contentDescription="@string/background"
android:layout_height="match_parent"
android:alpha="0.7"/>
Kt:
Picasso.get().load(R.drawable.background_green_forest).fit().centerCrop().into(view.imageView_background)