在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();