ImageView的setImageDrawable方法对于ShapeDrawable无效

6
我已经以编程方式创建了一个ShapeDrawable,并希望在ImageView中显示它。如果我使用ImageView.setImageDrawable(),我将无法看到ShapeDrawable。但是,如果我使用ImageView.setBackground(),它就可以工作。
为什么ImageView.setImageDrawable()不起作用?
来自布局文件的ImageView:
<ImageView
    android:id="@+id/myImageView"
    android:layout_width="100dp"
    android:layout_height="200dp" />

Activity的onCreate方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    int x = 0;
    int y = 0;
    int width = 300;
    int height = 250;

    ShapeDrawable drawable = new ShapeDrawable(new OvalShape());
    drawable.getPaint().setColor(0xff74AC23);
    drawable.setBounds(x, y, x + width, y + height);

    ImageView iv = findViewById(R.id.myImageView);
    iv.setBackground(drawable);        // works
    //iv.setImageDrawable(drawable);   // doesn't work
}

它可以工作,但在setImageDrawable之前必须设置图像的LayoutParams,例如iv.setLayoutParams(newLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - user9025311
@Eminem,那也不行。既然它们在布局XML中已经明确设置了,我也不应该再设置宽度和高度,对吧? - tronman
你可以尝试一下,但我不认为这是个问题。在我的评论之后,你是否调用了setImageDrawable函数,还是什么都没做? - user9025311
@Eminem 我添加了你建议的代码并调用了setImageDrawable(),但它没有起作用。当我调用setBackground()时,drawable确实出现了,并且填充整个屏幕,因为宽度和高度被设置为匹配父级。 - tronman
@Eminem WRAP_CONTENT 也不起作用。 - tronman
2个回答

6
为了在ImageView中显示ShapeDrawable,你的ShapeDrawable应该定义高度和宽度。将以下属性添加到你的ShapeDrawable中。 drawable.setIntrinsicHeight(height); drawable.setIntrinsicWidth(width);

我曾认为setBounds()是设置宽度和高度的,但现在我知道drawable的边框矩形和内在宽度和高度之间存在差异。谢谢! - tronman

1
你可以使用一个简单的View,将其背景设置为形状,使用setBackgroundDrawable方法。
ImageView可能无法显示您的形状,因为它没有默认大小。您可以使用sD.setIntrinsicWidth和sD.setIntrinsicHeight方法给您的形状设置默认大小。

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