如何在按钮中创建简单的可绘制图层

Posted

技术标签:

【中文标题】如何在按钮中创建简单的可绘制图层【英文标题】:How to create simple layer drawable in button 【发布时间】:2018-09-25 08:07:57 【问题描述】:

我试图更好地理解图层可绘制对象在按钮可绘制对象中的工作方式。

我正在尝试绘制 2 个简单的彩色框,其中一个没有插图,以便填充整个按钮可绘制区域。还有一个带有一些插图的。

ColorDrawable background1 = new ColorDrawable(Color.BLUE);
ColorDrawable background2 = new ColorDrawable(Color.GREEN);
Drawable[] drawables = new Drawable[] 
  background1,
  background2
;

LayerDrawable ld = new LayerDrawable(drawables);
ld.setLayerInset(0, 0, 0, 0, 0 ); // no inset on white box
ld.setLayerInset(1, 8, 8, 8, 8 ); // 8 inset on all side on green box

// set the left drawable on the button
button.setCompoundDrawablesWithIntrinsicBounds(ld, null, null, null);

但是这根本不起作用。第一个问题是盒子没有填满任何区域。那是因为按钮可绘制对象没有预定义的大小吗?如果是这种情况,我尝试在盒子上手动设置边界,但也没有太多运气。

谁能帮我理解我做错了什么?

【问题讨论】:

@pskink 谢谢。我不完全理解创建 BitmapDrawable 如何解决我的问题,您能进一步解释一下吗? IE 我将如何创建一个“填充”按钮 leftDrawable 空间的 bitmapdrawable? 不,我想在按钮可绘制区域中创建自己的“图像”。 IE 按钮有一个 leftDrawable、rightDrawable 等。我正在尝试以编程方式进行操作。所以以编程方式进行此操作,我试图通过在上面绘制 2 个彩色框来开始简单。只是想弄清楚它是如何工作的。 【参考方案1】:

在 Drawable 中创建特定设计并在 xml 中调用背景按钮

【讨论】:

我想以编程方式执行此操作。【参考方案2】:

现在ColorDrawable 的问题是确定可绘制边界的getIntrinsicWidth()/getIntrinsicHeight() 默认为-1,因此它不会在屏幕上呈现。对您的情况有帮助的是扩展 ColorDrawable 并覆盖构造函数的高度和宽度。

这是一个示例:

  class CustomDrawable(color: Int, val h: Int, val w: Int): ColorDrawable(color) 
    override fun getIntrinsicHeight(): Int 
      return h
    

    override fun getIntrinsicWidth(): Int 
      return w
    
  

然后你可以实例化它而不是像这样实例化ColorDrawable

val background1 = CustomDrawable(Color.BLUE, dimensionInPx , dimensionInPx)
val background2 = CustomDrawable(Color.GREEN, dimensionInPx, dimensionInPx)

确保在传递这些值之前将 dp 转换为 px

希望这会有所帮助。

【讨论】:

以上是关于如何在按钮中创建简单的可绘制图层的主要内容,如果未能解决你的问题,请参考以下文章

可以在 XML 中创建固定宽度的可绘制对象吗?

如何在 AngularJS 材料设计中创建简单的搜索输入文本?

如何在 .NET 中创建非 OwnerDraw 按钮?

如何在 iOS8 的通知窗口中创建按钮?

Android:如何制作一个可绘制的选择器

Android 如何在 Canvas 的 onDraw 方法中创建 onClick 事件