如何使用Picasso在代码中设置背景图片

28

我知道 Picasso 可以将图片加载到 ImageView 中,但我该如何使用 Picasso 设置我的布局背景图片?

我的代码:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relativelayout);
        relativeLayout.setBackgroundResource(R.drawable.table_background);
        Picasso.with(MainActivity.this)
                .load(R.drawable.table_background)
                .resize(200, 200)
                .into(relativeLayout);
        return relativeLayout;
    }
我这里的内容出现了错误,提示无法解决。我有一个ScrollView和相对布局。
2个回答

66

使用 Picasso 的回调函数

    Picasso.with(getActivity()).load(R.drawable.table_background).into(new Target(){

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

  @Override
  public void onBitmapFailed(final Drawable errorDrawable) {
      Log.d("TAG", "FAILED");
  }

  @Override
  public void onPrepareLoad(final Drawable placeHolderDrawable) {
      Log.d("TAG", "Prepare Load");
  }      
})

更新:

请查看此处。正如@OlivierH在评论中提到的那样。


2
请注意:正如这个答案中所提到的,Picasso对Target对象持有弱引用,因此很可能被垃圾回收。 - OlivierH
1
@OlivierH。我已经更新了答案。感谢您指出。 - Soham
另一个好的解决方案是将目标作为强引用存储在视图标记中。我在这里找到了解决方案,它对我有用:https://dev59.com/L2Af5IYBdhLWcg3w31-O - user2331454
什么是mainLayout? - Fernando Torres
@FernandoUrban,这是您想设置位图的布局。 - Soham
答案现在已经过时了。 - user12465043

0

最好的方法是创建自定义转换,例如用于填充颜色:

public class BackgroundColorTransform implements Transformation {

    @ColorInt int mFillColor;

    public BackgroundColorTransform(@ColorInt int color) {
        super();
        mFillColor = color;
    }

    @Override
    public Bitmap transform(Bitmap bitmap) {
        // Create another bitmap that will hold the results of the filter.
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Bitmap out = Bitmap.createBitmap(width, height, bitmap.getConfig());
        Canvas canvas = new Canvas(out);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        canvas.drawColor(mFillColor);
        canvas.drawBitmap(bitmap, 0f, 0f, paint);
        bitmap.recycle();
        return out;
    }

    @Override
    public String key() {
        return "BackgroundColorTransform:"+mFillColor;
    }

}

使用方法:

mPicasso.load(imageUrl)
               .transform(new BackgroundColorTransform(ContextCompat.getColor(getContext(),R.color.black)))
                .into(mLogoImageView);

如果您想添加一个vectorDrawable图像,请使用Transformation:

public class AddVectorDrawableTransform implements Transformation {

    private Drawable mDrawable;
    @ColorInt int mTintColor;

    public AddVectorDrawableTransform(Drawable drawable, @ColorInt int tintColor) {
        super();
        mDrawable = drawable;
        mTintColor = tintColor;
    }

    @Override
    public Bitmap transform(Bitmap bitmap) {
        // Create another bitmap that will hold the results of the filter.
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Bitmap out = Bitmap.createBitmap(width, height, bitmap.getConfig());
        Canvas canvas = new Canvas(out);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        canvas.drawBitmap(bitmap, 0f, 0f, paint);
        Drawable drawable = mDrawable.mutate();
        drawable = DrawableCompat.wrap(drawable);
        DrawableCompat.setTint(drawable, mTintColor);
        DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
//        mDrawable.setColorFilter( mTintColor, PorterDuff.Mode.MULTIPLY);
        drawable.setBounds(width/4, height/4, 3*width/4, 3*height/4);
        drawable.draw(canvas);
        bitmap.recycle();
        return out;
    }

    @Override
    public String key() {
        return "AddDrawableTransform:"+mDrawable+", "+mTintColor;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接