在Android 2.3 .X(Gingerbread)及更低版本上修改LayerDrawable图层

时间:2013-12-14 14:27:14

标签: android android-layout compatibility android-drawable layerdrawable

我有以下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设备,因为setDrawableByLayerId对于Gingerbread设备(link 1link 2)不稳定。我建议从头开始构建LayerDrawable。我开始这样做了,目前我遇到了设置第一层intristicInset的问题。

我尝试使用

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

dpxx是常数,我自己计算。然而,似乎这种方法不适用于姜饼(link 1)。

因此我决定尝试另外一种方式 - 设置我在第一层设置的drawable的restangle的边界:

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

完美,但似乎忽略LayerDrawable图层上的边界设置(link 1

现在建议我使用两个图像viwes的组合。不过,我的LayerDrawableLevelListDrawable的一部分,我认为我不能在其中包含布局。

总而言之,这使我无法以任何方式在Honeycomb之前的设备上修改LayerDrawable的内容。任何关于我应该如何进行的建议都表示赞赏!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

最后,我们以一种非常奇怪的方式开始了它:

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

我的一位同事发现,如果我们创建新的LayerDrawable,将非工作方法设置为它,然后将此LayerDrawable包装在另一个中,则可视化是正确的(图像都被更改)和填充保存)。相当多的调整和很多“不要触摸它的魔力”,但这是我们可以解决的最佳解决方案。