我正在尝试使用具有 2 层的 LayerDrawable 以编程方式为 ImageButton 创建一个 Drawable。这些图层是 ShapeDrawables。一代表按钮表面,其尺寸与按钮的尺寸相匹配。第二个是按钮上的标志,它比按钮小。以停止按钮为例。
我正在尝试使用 setIntrinsicWidth/setIntrinsicHeight 和 setLayerInset 的组合将标志放入按钮中心,但我得到了一个奇怪的结果。
public Drawable createStopButtonDrawable(int width, int height) {
//-- width = 60, height = 30
ShapeDrawable button = new ShapeDrawable(new RectShape());
button.setIntrinsicHeight(height);
button.setIntrinsicWidth(width);
button.setShaderFactory(new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
return new LinearGradient(0, 0, 0, height,
new int[]{0xCDCCCCCC, 0xCDFFFFFF, 0xCDCCCCCC},
new float[]{0, 0.3f, 1},
Shader.TileMode.REPEAT);
}
});
ShapeDrawable sign = new ShapeDrawable(new RectShape());
int signSize = (int)(STOP_SIGN_SIZE_RATIO * (float)Math.min(width, height));
//-- signSize = 12
sign.setIntrinsicHeight(signSize);
sign.setIntrinsicWidth(signSize);
Paint psPaint = sign.getPaint();
psPaint.setStyle(Style.FILL);
psPaint.setColor(PLAY_BUTTON_SIGN_COLOR);
Drawable[] layers = new Drawable[]{ button, sign };
LayerDrawable ld = new LayerDrawable(layers);
ld.setBounds(0, 0, width, height);
ld.setLayerInset(0, 0, 0, 0, 0);
int sx = (int)( (width - signSize)/2.0f );
//-- sx = 24
int sy = (int)( (height - signSize)/2.0f );
//-- sy = 9
ld.setLayerInset(1, sx, sy, sx, sy); //-- 1. Sign stretched
//ld.setLayerInset(1, sx, 10, sx, 9); //-- 2. Almost good
return ld;
}
这将生成带有拉伸符号以匹配按钮大小的按钮。
但是,如果我将“1. 符号拉伸”这一行替换为“2. 几乎好”,我会得到几乎预期的结果。
我究竟做错了什么?
我还注意到显示的按钮表面大小为 59x29,而不是预期的 60x30。