Подтвердить что ты не робот

Как загрузить фоновый рисунок с использованием Picasso

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

Невозможно установить LinearLayout BackgroundResource из URL с помощью Picasso

4b9b3361

Ответ 1

Вы можете использовать Picasso 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 в комментарии, Пикассо имеет слабую ссылку на объекты 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
    }
}

Ответ 2

Я использую 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() {

                        }
                    });

Ответ 3

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

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() {
        }
    });

Ответ 4

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

android:scaleType="fitXY"