如何更改图层列表drawable?

时间:2011-11-05 05:48:47

标签: android android-drawable

尝试学习一些新东西并且无法想出这一点,任何帮助都表示赞赏。鉴于这个简单的代码来自谷歌的文档:

layers.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" />

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

感谢。

所以现在我有了我的新drawable,我想在变量myImage中交换正确吗?现在我如何将其纳入图层列表?我假设我使用findDrawableByLayerIdsetDrawableByLayerId,但具体如何?或者我可能完全错了!救命啊!

我想做什么?更改显示的drawable。例如,假设我有另一个名为“android_purple”的drawable,我将如何在上面的layer-list示例中为“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.

2 个答案:

答案 0 :(得分:52)

  

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

以下是我要尝试的内容:

步骤1:将android:id元素放在<item>元素上,如图所示in the documentation

第2步:将getDrawable()结果投射到LayerDrawable

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

步骤4:致电setDrawableByLayerId()为给定的图层ID设置/替换Drawable

答案 1 :(得分:51)

步骤1:从drawable文件夹中检索图层列表:(我在/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)方法替换Image

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,以达到这一点。所有答案都与本页面上的答案相似。我试图做同样的事情。然后我想到了“更新图像”的想法并且来到了这里。

当您想要将Bitmap放在列表中的项目之一时,应该/也可以。您只需使用replace(setDrawableByLayerId)方法。替换ids。 ImageView有很多方法。

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