我正在尝试使用LayerDrawable
作为自定义UI小部件,并且使用与其他图层不同的边界绘制一个图层,但它似乎不起作用。基本上,我的代码执行此操作:
int left, top, right, bottom;
/*... do some math ... */
Drawable d = mDrawable.findDrawableByLayerId(R.id.some_specific_layer);
d.setBounds(left, top, right, bottom);
同时,xml看起来像这样:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle" >
<solid android:color="#ff999999" />
</shape>
</item>
<item
android:id="@id/some_specific_layer"
android:drawable="@drawable/some_drawable"/>
理想情况下,我会在灰色矩形上看到some_drawable,从后面显示灰色量取决于边界计算的结果。但我从来没有看到任何灰色层,它似乎是因为它的界限也是以某种方式设置的。
修改
以下是期望与预期结果的视觉效果:
顶部图像是我想要实现的;灰色对应于第一层,渐变对应于具有预定义id
的第二层。实际结果从未显示灰色。
有没有人知道是否可以设置LayerDrawable
的一层边界而不影响其他图层?
答案 0 :(得分:1)
我收到了Android开发者Google小组的一些回复。从本质上讲,使用LayerDrawable
没有可靠的方法来执行此操作,因为它管理所有孩子Drawables
的状态。我采用了一种方法,使用两个单独的drawables,结果令人满意。以下是供参考的讨论主题:
https://groups.google.com/d/topic/android-developers/fUxtJstdkBM/discussion
答案 1 :(得分:0)
我已经设法使用LayerDrawable:
对此代码执行类似的操作// create first shape
ShapeDrawable shape1 = new ShapeDrawable(new OvalShape());
shape1.getPaint().setColor(0xFFFFFF00);
shape1.setIntrinsicWidth(50);
shape1.setIntrinsicHeight(50);
shape1.invalidateSelf();
// create second shape
ShapeDrawable shape2 = new ShapeDrawable(new OvalShape());
shape2.getPaint().setColor(0xFFFFB400);
shape2.setIntrinsicWidth(20);
shape2.setIntrinsicHeight(50);
shape2.invalidateSelf();
// create layerDrawable (layer-list in xml)
// it containt our 2 shapes and the order in wich they will be drawn (shape2 is on top).
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{shape1, shape2});
// ajust position shape1 and shape2
layerDrawable.setLayerInset(0, 0,0,0,0);
layerDrawable.setLayerInset(1, 15,0,15,0);
结果是(在黑色背景上):