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

在Android 2.3.X(姜饼)及更低版本上修改LayerDrawable层,android,android-layout,compatibility,android-drawable,layerdrawable,Android,Android Layout,Compatibility,Android Drawable,Layerdrawable,我有以下资料: 但是,这在姜饼设备上不起作用,因为姜饼设备(,)的setDrawableByLayerId不稳定。建议我从头开始构建LayerDrawable。我开始这样做,目前面临的问题是设置第一层的intristicInset 我试着用 mLayerDrawable.setLayerInset(0, dp14, dp6, dp14, dp6); 其中,dpxx是我自己计算的常数。然而,这种方法似乎也不适用于姜饼() 因此,我决定尝试另一种方法——设置我在第一层设置的可绘制图形的重新角度的边

我有以下资料:

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

我试着用

mLayerDrawable.setLayerInset(0, dp14, dp6, dp14, dp6);
其中,
dpxx
是我自己计算的常数。然而,这种方法似乎也不适用于姜饼()

因此,我决定尝试另一种方法——设置我在第一层设置的可绘制图形的重新角度的边界:

drawable.setBounds(dp14, dp6, dp90 - dp14, dp90 - dp6);
完美,但似乎忽略了
LayerDrawable
层上的边界设置()

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


所有这些都使我无法在预蜂窝设备上以任何方式修改我的
LayerDrawable
的内容。任何关于我应该如何进行的建议都将不胜感激

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

LayerDrawable layerDrawable = (LayerDrawable) getResources().getDrawable(layerDrawableResourceId);
layerDrawable.setDrawableByLayerId(R.id.image_source, drawable);
Drawable[] layers = {
   layerDrawable };
LayerDrawable layerDrawableNew = new LayerDrawable(layers);
我的一位同事发现,如果我们创建新的
LayerDrawable
,将不起作用的方法设置为它,然后将此
LayerDrawable
包装在另一个中,则可视化是正确的(图像被更改,填充被保留)。我们做了很多调整,还有很多“别碰这个,这很神奇”,但这是我们能找到的最好的解决方案

drawable.setBounds(mLayerDrawable.findDrawableByLayerId(R.id.image_source).getBounds());
mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable);        
mLayerDrawable.invalidateSelf();
参考:

FrameLayout
中只需使用两个
ImageView
小部件,就可以更轻松地实现图层效果。@commonware感谢您的建议。但是请注意我提到的内容-我正在使用
levellistdawable
作为我的
层可绘制的容器。我不知道有什么方法可以将
FrameLayout
作为level包含在
levellistdawable
中……很抱歉,我错过了。您在哪里使用
LevelListDrawable
?@commonware基本上您在这里看到的是我的解决方案的一部分,用于优化文件系统的缩略图显示。我有一些文件类型具有
LayerDrawable
s作为缩略图-例如,音乐文件以cd的形式呈现。我使用
LevelListDrawable
来寻求性能优化。但是,为什么您必须在运行时更改映像源?这不像是一个文件会在运行中神奇地改变文件类型。你在这里发现了一个不错的黑客。对我来说是一种魅力。谢谢;)
LayerDrawable layerDrawable = (LayerDrawable) getResources().getDrawable(layerDrawableResourceId);
layerDrawable.setDrawableByLayerId(R.id.image_source, drawable);
Drawable[] layers = {
   layerDrawable };
LayerDrawable layerDrawableNew = new LayerDrawable(layers);
drawable.setBounds(mLayerDrawable.findDrawableByLayerId(R.id.image_source).getBounds());
mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable);        
mLayerDrawable.invalidateSelf();