4

我有以下内容LayerDrawable

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/image_source"
        android:bottom="6dp"
        android:drawable="@drawable/default"
        android:left="14dp"
        android:right="14dp"
        android:top="6dp">
    </item>
    <item android:drawable="@drawable/metaphor_photo_portrait"/>

</layer-list>

我需要能够@+id/image_source从代码中动态替换图像。我成功地在 Honeycomb+ 设备上使用:

mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable);
mLayerDrawable.invalidateSelf();

但是,这在 Gingerbread 设备上不起作用,因为 Gingerbread 设备(链接 1链接 2setDrawableByLayerId )不稳定。建议我从头开始构建。我开始这样做,目前面临设置第一层的问题。LayerDrawableintristicInset

我尝试使用

mLayerDrawable.setLayerInset(0, dp14, dp6, dp14, dp6);

dpxx我自己计算的常数在哪里。但是,这种方法似乎也不适用于 Gingerbread(链接 1)。

因此,我决定尝试另一种方式 - 设置我在第一层设置的可绘制对象的重新角的边界:

drawable.setBounds(dp14, dp6, dp90 - dp14, dp90 - dp6);

完美,但是似乎LayerDrawable忽略了图层上的边界设置(链接 1

现在建议我使用两个图像视图的组合。但是我LayerDrawable是其中的一部分,LevelListDrawable我认为我不能在其中包含布局。

总而言之,这让我无法以LayerDrawable任何方式在蜂窝设备之前的设备上修改我的内容。任何关于我应该如何进行的建议都将不胜感激!

4

2 回答 2

3
drawable.setBounds(mLayerDrawable.findDrawableByLayerId(R.id.image_source).getBounds());
mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable);        
mLayerDrawable.invalidateSelf();

参考: https ://github.com/ytRino/LayerDrawableSample/blob/master/src/net/nessness/android/sample/layerdrawable/LayerDrawableSampleActivity.java

于 2014-01-10T08:52:44.963 回答
0

最后,我们以一种非常奇怪的方式让它炒起来:

LayerDrawable layerDrawable = (LayerDrawable) getResources().getDrawable(layerDrawableResourceId);
layerDrawable.setDrawableByLayerId(R.id.image_source, drawable);
Drawable[] layers = {
   layerDrawable };
LayerDrawable layerDrawableNew = new LayerDrawable(layers);

我的一位同事发现,如果我们创建 new LayerDrawable,为其设置 not-working 方法,然后将其包装LayerDrawable在另一个中,则可视化是正确的(图像已更改且填充保留)。相当多的调整和很多“不要碰这个它很神奇”,但这是我们可以解决的最佳解决方案。

于 2013-12-16T11:36:41.670 回答