45

尝试学习一些新事物,但无法弄清楚这一点,感谢您的帮助。鉴于谷歌文档中的这个简单代码:

层.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/first_image">
      <bitmap android:src="@drawable/android_red"
        android:gravity="center" />
    </item>
    <item android:id="@+id/second_image" android:top="10dp" android:left="10dp">
      <bitmap android:src="@drawable/android_green"
        android:gravity="center" />
    </item>
    <item android:id="@+id/third_image" android:top="20dp" android:left="20dp">
      <bitmap android:src="@drawable/android_blue"
        android:gravity="center" />
    </item>
</layer-list>

和 main.xml:

<ImageView
    android:id="@+myImageView"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/layers" />

问题:如何以编程方式引用图层列表中的一个可绘制对象,以便将其更改为不同的可绘制对象?

谢谢。

所以现在我有我想换成变量的新可绘制对象myImage正确吗?现在我如何把它放到图层列表中?我假设我使用findDrawableByLayerIdand setDrawableByLayerId,但究竟如何?或者我可能做错了!帮助!

我想做什么?更改显示的可绘制对象。例如,假设我有另一个名为“android_purple”的drawable,我将如何将它切换为上面图层列表示例中的“android_green”drawable?

编辑:

到目前为止,我的知识有限(这不起作用我得到setDrawableByLayerId未定义的错误):

Resources res = getApplicationContext().getResources();
BitmapDrawable newImage = (BitmapDrawable) res.getDrawable(R.drawable.android_purple); //Get replacement image, can't use LayerDrawable or get error.   
boolean layer_drawable_changed = (setDrawableByLayerId((R.id.second_image), newImage)); //Set new drawable? Error on this line.
4

2 回答 2

59

问题:如何以编程方式引用图层列表中的一个可绘制对象,以便将其更改为不同的可绘制对象?

这是我会尝试的:

步骤#1:将android:id属性放在文档<item>中说明的元素上

步骤#2:将getDrawable()结果转换为LayerDrawable

第 3 步:mutate()如果您不想影响其他人,请致电Drawable(可能是可选的)

第 4 步:调用setDrawableByLayerId()以设置/替换Drawable给定层 ID 的 a

于 2011-11-05T11:30:37.137 回答
56

第 1 步:从可绘制文件夹中检索图层列表:(我的在 /res/drawable/digits.xml 中被称为数字)

LayerDrawable ld = (LayerDrawable) getResources().getDrawable(R.drawable.digits);

第 2 步:命名替换图像(不是图层列表中已经存在的图像)

Drawable replace = (Drawable) getResources().getDrawable(R.drawable.replacing_image);

第 3 步:使用 setDrawableByLayerId(int id, Drawable d) 方法替换图像

boolean testfactor = ld.setDrawableByLayerId(R.id.first_image, replace);

这将返回一个布尔值,如果替换图像失败将返回 false

第4步:加载主Imageview(在实际的xml布局代码中基本上是layer-list的id)

ImageView layoutlist1 = (ImageView)findViewById(R.id.layout_list1);

第 5 步:(重新)-使用更新后的 LayerDrawable 设置 Imageview,方法是:

layoutlist1.setImageDrawable(ld);

资源:我是一名软件和移动应用程序开发人员。

为了达到这一点,我浏览了整个网络和 Stackflow.com。所有的答案都和这个页面上的答案一样。我试图做同样的事情。然后我想到了“更新图像”的想法并想到了这一点。

当您想要将位图代替列表中的一个项目时,这应该/也可以工作。您只需要使用替换 (setDrawableByLayerId) 方法。替换 ids。ImageView 有很多方法。

这也很有帮助:LayerList drawable + conversion to a Bitmap

于 2012-06-13T19:22:37.150 回答