Как загрузить макет фона с помощью 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)
Другие вопросы по тегам