如何使用Picasso加载布局背景

时间:2015-07-16 21:30:26

标签: android android-layout picasso

有人能指出我如何用Picasso以编程方式改变XML布局的背景吗?我发现的所有示例都能够使用Picasso更新ImageView,但不能更新布局背景。

Unable to set LinearLayout BackgroundResource from URL using Picasso

5 个答案:

答案 0 :(得分:31)

你可以使用毕加索的目标:

         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对象有一个弱引用,因此可能会被垃圾收集。

所以,关于其中一个问题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 :(得分:6)

我使用ImageView作为临时ImageHolder。首先,使用毕加索将图像加载到ImageView中,然后使用getDrawable从此ImageView设置布局背景。

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

                        }
                    });

答案 2 :(得分:1)

上述解决方案均不适合我。但是@ 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() {
        }
    });

答案 3 :(得分:0)

在我的情况下,我需要图像以适合imageview的大小,所以不是在背景中加载图像,而是将此属性添加到imageview并正常加载图像。

android:scaleType="fitXY"

答案 4 :(得分:0)

作为先前答案的替代方法。只需在版面中使用匹配父对象创建ImageView,就可以通过Piccasso设置背景。

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)